blume 2.2.1 → 2.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/cli/{chunk-080mfch6.js → chunk-0wt5amrk.js} +15 -15
  3. package/dist/cli/{chunk-k45sq16q.js → chunk-0xyedh7k.js} +39 -23
  4. package/dist/cli/{chunk-k45sq16q.js.map → chunk-0xyedh7k.js.map} +3 -3
  5. package/dist/cli/{chunk-f260jdrn.js → chunk-0ynr0fr7.js} +5 -5
  6. package/dist/cli/{chunk-e1n41w9m.js → chunk-1ay3hzn0.js} +3 -3
  7. package/dist/cli/{chunk-b680sv30.js → chunk-2f6btenb.js} +10 -8
  8. package/dist/cli/chunk-2f6btenb.js.map +13 -0
  9. package/dist/cli/{chunk-gwy55cx3.js → chunk-426rytg6.js} +2 -2
  10. package/dist/cli/{chunk-9h8mh2tk.js → chunk-5f96yq2c.js} +1 -1
  11. package/dist/cli/{chunk-x60e15st.js → chunk-5xq12jz7.js} +17 -17
  12. package/dist/cli/{chunk-x7bh6d9j.js → chunk-6xag1c83.js} +4 -4
  13. package/dist/cli/{chunk-487b95qy.js → chunk-88q28zav.js} +41 -25
  14. package/dist/cli/{chunk-487b95qy.js.map → chunk-88q28zav.js.map} +3 -3
  15. package/dist/cli/{chunk-yg8ckc3g.js → chunk-88zkpg89.js} +2 -2
  16. package/dist/cli/{chunk-ppa6mg4d.js → chunk-8fm3b4vm.js} +6 -6
  17. package/dist/cli/{chunk-rtvgmg2j.js → chunk-8h2t2vyj.js} +2 -2
  18. package/dist/cli/{chunk-2ssh60qh.js → chunk-982qfeny.js} +6 -6
  19. package/dist/cli/{chunk-t2h8pwy1.js → chunk-9emfspcp.js} +4 -4
  20. package/dist/cli/{chunk-9jqmq5hv.js → chunk-akj2p7k1.js} +6 -6
  21. package/dist/cli/{chunk-beb0z983.js → chunk-b664x65a.js} +16 -16
  22. package/dist/cli/{chunk-kmswjxj9.js → chunk-b7n58hgj.js} +3 -3
  23. package/dist/cli/{chunk-fnxgtjeq.js → chunk-c0qddrxr.js} +1 -1
  24. package/dist/cli/{chunk-p834rkcn.js → chunk-g62vnvaw.js} +5 -5
  25. package/dist/cli/{chunk-zxd5jrgx.js → chunk-gc7knd2s.js} +76 -34
  26. package/dist/cli/{chunk-zxd5jrgx.js.map → chunk-gc7knd2s.js.map} +4 -4
  27. package/dist/cli/{chunk-r5nm9w0c.js → chunk-hwjspffr.js} +105 -36
  28. package/dist/cli/{chunk-r5nm9w0c.js.map → chunk-hwjspffr.js.map} +11 -10
  29. package/dist/cli/{chunk-40vk8kgf.js → chunk-p4fe7tax.js} +7 -7
  30. package/dist/cli/{chunk-34wap3ed.js → chunk-psg2za5z.js} +3 -3
  31. package/dist/cli/{chunk-hktq4j5r.js → chunk-pxp1y6yz.js} +16 -10
  32. package/dist/cli/{chunk-hktq4j5r.js.map → chunk-pxp1y6yz.js.map} +4 -4
  33. package/dist/cli/{chunk-qcyxkj44.js → chunk-qax1aekz.js} +43 -17
  34. package/dist/cli/chunk-qax1aekz.js.map +15 -0
  35. package/dist/cli/{chunk-h0qwdbem.js → chunk-r5ajrw1g.js} +2 -2
  36. package/dist/cli/{chunk-q1wwrxzw.js → chunk-rc2qk3qx.js} +3 -3
  37. package/dist/cli/chunk-rc2qk3qx.js.map +10 -0
  38. package/dist/cli/{chunk-69rjf786.js → chunk-ry2ymbxf.js} +5 -5
  39. package/dist/cli/{chunk-gxhcf2hs.js → chunk-t43g7v22.js} +2 -2
  40. package/dist/cli/{chunk-ydqzkhjn.js → chunk-x0jqyq1g.js} +6 -6
  41. package/dist/cli/{chunk-aafhwx74.js → chunk-x25s4gph.js} +1 -1
  42. package/dist/cli/{chunk-nqna8dzp.js → chunk-xkx216rd.js} +17 -17
  43. package/dist/cli/{chunk-etckvbrh.js → chunk-xv8nkt56.js} +14 -14
  44. package/dist/cli/{chunk-hn3g2b89.js → chunk-yrmw5n2b.js} +9 -9
  45. package/dist/cli/{chunk-4zxh25hc.js → chunk-zgca0vxs.js} +2 -2
  46. package/dist/cli/{chunk-c5bjxq8v.js → chunk-zj6bcx0n.js} +2 -2
  47. package/dist/cli/{chunk-1ch3ct3r.js → chunk-zjfwzrvd.js} +14 -14
  48. package/dist/cli/{chunk-j4nfgn2j.js → chunk-znwhf37a.js} +1 -1
  49. package/dist/cli/index.js +18 -18
  50. package/dist/types/ai/ask-context.d.ts +8 -0
  51. package/dist/types/ai/link-text.d.ts +5 -0
  52. package/dist/types/ai/relative-links.d.ts +26 -6
  53. package/dist/types/core/config-input.d.ts +35 -1
  54. package/dist/types/core/data.d.ts +14 -0
  55. package/dist/types/core/last-modified.d.ts +33 -18
  56. package/dist/types/core/links.d.ts +16 -0
  57. package/dist/types/core/schema.d.ts +16 -1
  58. package/dist/types/core/types.d.ts +10 -0
  59. package/dist/types/deploy/sitemap.d.ts +9 -0
  60. package/dist/types/search/documents.d.ts +3 -1
  61. package/dist/types/search/fold.d.ts +33 -0
  62. package/dist/types/search/orama-index.d.ts +4 -4
  63. package/dist/types/seo/jsonld.d.ts +33 -0
  64. package/docs/configuration/search.mdx +2 -2
  65. package/docs/content/frontmatter.mdx +1 -1
  66. package/docs/content/i18n.mdx +1 -1
  67. package/docs/content/sources/remote-mdx.mdx +1 -1
  68. package/docs/discoverability/open-graph.mdx +16 -1
  69. package/docs/discoverability/sitemap-and-robots.mdx +12 -0
  70. package/docs/discoverability/structured-data.mdx +44 -0
  71. package/package.json +1 -1
  72. package/src/ai/ask-context.ts +52 -14
  73. package/src/ai/ask-data.ts +4 -1
  74. package/src/ai/ask-tools.ts +17 -5
  75. package/src/ai/link-text.ts +6 -0
  76. package/src/ai/llms.ts +1 -7
  77. package/src/ai/markdown.ts +8 -4
  78. package/src/ai/relative-links.ts +155 -48
  79. package/src/ai/site-skill.ts +1 -4
  80. package/src/astro/generate.ts +7 -0
  81. package/src/astro/templates.ts +36 -20
  82. package/src/components/layout/PageActions.astro +45 -18
  83. package/src/components/layout/PageLayout.astro +25 -12
  84. package/src/components/layout/RootLayout.astro +8 -1
  85. package/src/components/layout/locale-redirect.ts +38 -19
  86. package/src/components/layout/search/types.ts +12 -4
  87. package/src/core/config-input.ts +34 -1
  88. package/src/core/config.ts +5 -2
  89. package/src/core/data.ts +14 -0
  90. package/src/core/last-modified.ts +80 -34
  91. package/src/core/links.ts +43 -2
  92. package/src/core/manifest.ts +2 -0
  93. package/src/core/project-graph.ts +83 -43
  94. package/src/core/schema.ts +47 -9
  95. package/src/core/types.ts +10 -0
  96. package/src/deploy/sitemap.ts +127 -49
  97. package/src/openapi/proxy.ts +5 -1
  98. package/src/search/documents.ts +34 -11
  99. package/src/search/fold.ts +175 -0
  100. package/src/search/orama-index.ts +40 -49
  101. package/src/seo/jsonld.ts +100 -23
  102. package/dist/cli/chunk-b680sv30.js.map +0 -13
  103. package/dist/cli/chunk-q1wwrxzw.js.map +0 -10
  104. package/dist/cli/chunk-qcyxkj44.js.map +0 -14
  105. /package/dist/cli/{chunk-080mfch6.js.map → chunk-0wt5amrk.js.map} +0 -0
  106. /package/dist/cli/{chunk-f260jdrn.js.map → chunk-0ynr0fr7.js.map} +0 -0
  107. /package/dist/cli/{chunk-e1n41w9m.js.map → chunk-1ay3hzn0.js.map} +0 -0
  108. /package/dist/cli/{chunk-gwy55cx3.js.map → chunk-426rytg6.js.map} +0 -0
  109. /package/dist/cli/{chunk-9h8mh2tk.js.map → chunk-5f96yq2c.js.map} +0 -0
  110. /package/dist/cli/{chunk-x60e15st.js.map → chunk-5xq12jz7.js.map} +0 -0
  111. /package/dist/cli/{chunk-x7bh6d9j.js.map → chunk-6xag1c83.js.map} +0 -0
  112. /package/dist/cli/{chunk-yg8ckc3g.js.map → chunk-88zkpg89.js.map} +0 -0
  113. /package/dist/cli/{chunk-ppa6mg4d.js.map → chunk-8fm3b4vm.js.map} +0 -0
  114. /package/dist/cli/{chunk-rtvgmg2j.js.map → chunk-8h2t2vyj.js.map} +0 -0
  115. /package/dist/cli/{chunk-2ssh60qh.js.map → chunk-982qfeny.js.map} +0 -0
  116. /package/dist/cli/{chunk-t2h8pwy1.js.map → chunk-9emfspcp.js.map} +0 -0
  117. /package/dist/cli/{chunk-9jqmq5hv.js.map → chunk-akj2p7k1.js.map} +0 -0
  118. /package/dist/cli/{chunk-beb0z983.js.map → chunk-b664x65a.js.map} +0 -0
  119. /package/dist/cli/{chunk-kmswjxj9.js.map → chunk-b7n58hgj.js.map} +0 -0
  120. /package/dist/cli/{chunk-fnxgtjeq.js.map → chunk-c0qddrxr.js.map} +0 -0
  121. /package/dist/cli/{chunk-p834rkcn.js.map → chunk-g62vnvaw.js.map} +0 -0
  122. /package/dist/cli/{chunk-40vk8kgf.js.map → chunk-p4fe7tax.js.map} +0 -0
  123. /package/dist/cli/{chunk-34wap3ed.js.map → chunk-psg2za5z.js.map} +0 -0
  124. /package/dist/cli/{chunk-h0qwdbem.js.map → chunk-r5ajrw1g.js.map} +0 -0
  125. /package/dist/cli/{chunk-69rjf786.js.map → chunk-ry2ymbxf.js.map} +0 -0
  126. /package/dist/cli/{chunk-gxhcf2hs.js.map → chunk-t43g7v22.js.map} +0 -0
  127. /package/dist/cli/{chunk-ydqzkhjn.js.map → chunk-x0jqyq1g.js.map} +0 -0
  128. /package/dist/cli/{chunk-aafhwx74.js.map → chunk-x25s4gph.js.map} +0 -0
  129. /package/dist/cli/{chunk-nqna8dzp.js.map → chunk-xkx216rd.js.map} +0 -0
  130. /package/dist/cli/{chunk-etckvbrh.js.map → chunk-xv8nkt56.js.map} +0 -0
  131. /package/dist/cli/{chunk-hn3g2b89.js.map → chunk-yrmw5n2b.js.map} +0 -0
  132. /package/dist/cli/{chunk-4zxh25hc.js.map → chunk-zgca0vxs.js.map} +0 -0
  133. /package/dist/cli/{chunk-c5bjxq8v.js.map → chunk-zj6bcx0n.js.map} +0 -0
  134. /package/dist/cli/{chunk-1ch3ct3r.js.map → chunk-zjfwzrvd.js.map} +0 -0
  135. /package/dist/cli/{chunk-j4nfgn2j.js.map → chunk-znwhf37a.js.map} +0 -0
@@ -5,9 +5,9 @@
5
5
  "import { join } from \"pathe\";\n\nimport { buildAgentReadability } from \"../ai/agent-readability.ts\";\nimport {\n AI_CATALOG_PATH,\n ARD_MANIFEST_PATH,\n buildAiCatalog,\n} from \"../ai/ai-catalog.ts\";\nimport { API_CATALOG_PATH, buildApiCatalog } from \"../ai/api-catalog.ts\";\nimport {\n API_NAVIGATION_PATH,\n API_PAGES_PATH,\n OPENAPI_PATH,\n} from \"../ai/api/paths.ts\";\nimport { SKILL_MD_PATH } from \"../ai/site-skill.ts\";\nimport { AGENT_SKILLS_INDEX_PATH, servesSkillsIndex } from \"../ai/skills.ts\";\nimport type { SkillArtifact } from \"../ai/skills.ts\";\nimport {\n buildSignaturesDirectory,\n SIGNATURES_DIRECTORY_PATH,\n} from \"../ai/web-bot-auth.ts\";\nimport type { BlumeProject } from \"../core/project-graph.ts\";\nimport type { ResolvedConfig } from \"../core/schema.ts\";\nimport { staticFileResolver } from \"../core/static-files.ts\";\nimport { buildRobots } from \"./robots.ts\";\nimport { buildRssFeeds } from \"./rss.ts\";\nimport { buildSitemapFiles } from \"./sitemap.ts\";\n\n/** A generated `.well-known` discovery document: `null` content when it's off. */\nexport interface WellKnownFile {\n content: string | null;\n label: string;\n path: string;\n}\n\n/**\n * The generated `.well-known` discovery documents — the Web Bot Auth signature\n * directory, the RFC 9727 API catalog, and the AI catalog under both the\n * ai-catalog spec's well-known URI and the ARD v0.91 one (see\n * `ai/ai-catalog.ts`) — each with `null` content when its feature is off.\n */\nexport const wellKnownFiles = (\n config: ResolvedConfig,\n skills: readonly SkillArtifact[]\n): WellKnownFile[] => {\n const aiCatalog = buildAiCatalog(config, skills);\n return [\n {\n content: buildSignaturesDirectory(config),\n label: \"Web Bot Auth\",\n path: SIGNATURES_DIRECTORY_PATH,\n },\n {\n content: buildApiCatalog(config),\n label: \"RFC 9727\",\n path: API_CATALOG_PATH,\n },\n { content: aiCatalog, label: \"AI Catalog\", path: AI_CATALOG_PATH },\n { content: aiCatalog, label: \"ARD manifest\", path: ARD_MANIFEST_PATH },\n ];\n};\n\n/**\n * The files a build serves beside its pages that don't come from `public/`,\n * as base-less root-relative paths: what `publishBuildArtifacts` writes once\n * Astro is done (llms.txt, the sitemap, robots.txt, `agent-readability.json`,\n * the `.well-known` discovery documents, the Agent Skills index, `skill.md`)\n * and the generated endpoints at fixed paths (the RSS feeds, the JSON docs\n * API and its OpenAPI description, the MCP discovery documents). Each is\n * listed under the gate its writer reads, so a feature the config switches\n * off drops its file here too: `blume validate` accepts a link to\n * `/llms.txt` exactly when the build writes one.\n *\n * Read from the config alone, before a build: the skill archives a build\n * publishes beside the index, and the platform files (`_redirects`,\n * `_headers`, `vercel.json`), aren't listed. A page's Markdown copy\n * (`/guide.md`) is its route's, and resolves through the page.\n */\nexport const generatedFilePaths = (project: BlumeProject): string[] => {\n const { config } = project;\n const paths: string[] = [];\n if (config.agents.llmsTxt.enabled) {\n paths.push(\"/llms.txt\", \"/llms-full.txt\");\n }\n paths.push(\n ...(buildSitemapFiles(project) ?? []).map((file) => `/${file.name}`)\n );\n if (buildRobots(project)) {\n paths.push(\"/robots.txt\");\n }\n if (buildAgentReadability(project)) {\n paths.push(\"/agent-readability.json\");\n }\n paths.push(\n ...wellKnownFiles(config, []).flatMap((file) =>\n file.content ? [file.path] : []\n )\n );\n if (servesSkillsIndex(config)) {\n paths.push(AGENT_SKILLS_INDEX_PATH);\n if (config.agents.skillMd) {\n paths.push(SKILL_MD_PATH);\n }\n }\n paths.push(...buildRssFeeds(project).map((feed) => feed.path));\n if (config.agents.api) {\n paths.push(OPENAPI_PATH, API_PAGES_PATH, API_NAVIGATION_PATH);\n }\n if (config.agents.mcp.enabled) {\n paths.push(\"/.well-known/mcp.json\", \"/.well-known/mcp/server-card.json\");\n }\n return paths;\n};\n\n/**\n * Whether a base-less path is a file the project's site serves beside its\n * pages: one in `public/` (`/spec.pdf`, a folder's `index.html`) or one the\n * build generates (`/llms.txt`). What `generateRuntime` and `blume doctor`\n * check navigation entries against, beside the routes, as `blume validate`\n * checks links.\n */\nexport const servedFiles = (\n project: BlumeProject\n): ((path: string) => boolean) =>\n staticFileResolver(\n join(project.context.root, \"public\"),\n generatedFilePaths(project)\n );\n",
6
6
  "import { mountBasePath, normalizeBasePath } from \"../core/base-path.ts\";\nimport { repoUrl } from \"../core/github.ts\";\nimport type { BlumeProject } from \"../core/project-graph.ts\";\nimport type { ContentSignalPolicy, ContentSignals } from \"../core/schema.ts\";\nimport { absoluteUrl } from \"../core/site-url.ts\";\nimport { deployPlatform } from \"../deploy/platforms/index.ts\";\nimport { buildRssFeeds } from \"../deploy/rss.ts\";\nimport { AI_CATALOG_PATH, hasAiCatalog } from \"./ai-catalog.ts\";\nimport { hasApiCatalog } from \"./api-catalog.ts\";\nimport { API_PAGES_PATH, API_SEARCH_PATH, OPENAPI_PATH } from \"./api/paths.ts\";\nimport { servesSkillsIndex } from \"./skills.ts\";\n\n/** Token map for the machine-readable content-usage echo. */\nconst USAGE_TOKENS: [keyof ContentSignalPolicy, string][] = [\n [\"search\", \"search\"],\n [\"aiInput\", \"ai-input\"],\n [\"aiTrain\", \"ai-train\"],\n];\n\n/**\n * The configured usage preferences as a `{ token: allowed }` object, or null\n * when the declaration is disabled (`contentSignals: false`). Mirrors the\n * robots.txt `Content-Signal` line so an agent that reads the manifest instead\n * of robots.txt sees the same policy.\n */\nconst usagePolicy = (\n signals: ContentSignals\n): Record<string, boolean> | null => {\n if (!signals) {\n return null;\n }\n return Object.fromEntries(\n USAGE_TOKENS.map(([key, token]) => [token, signals[key]] as const)\n );\n};\n\n/**\n * The advertised assistant URL. An external endpoint is not served under\n * `deployment.base`, so a root-relative one absolutizes against the site\n * origin alone; the built-in route gets site and base via `abs`.\n */\nconst askApiUrl = (\n endpoint: string | undefined,\n site: string | null,\n abs: (path: string) => string\n): string => {\n if (!endpoint) {\n return abs(\"/api/ask\");\n }\n return site && endpoint.startsWith(\"/\")\n ? absoluteUrl(site, endpoint)\n : endpoint;\n};\n\n/** The `.well-known` discovery URLs a site can publish. */\ninterface WellKnownArtifacts {\n httpMessageSignaturesDirectory?: string;\n aiCatalog?: string;\n apiCatalog?: string;\n agentSkills?: string;\n}\n\n/** The JSON docs API's entry points; `search` exists on server output only. */\ninterface ApiArtifact {\n openapi: string;\n pages: string;\n search?: string;\n}\n\n/** The agent-facing artifact index the manifest publishes. */\ninterface AgentArtifacts extends WellKnownArtifacts {\n markdown: { contentNegotiation?: string; pattern: string };\n api?: ApiArtifact;\n llmsFullTxt?: string;\n llmsTxt?: string;\n mcp?: { discovery: string; url: string };\n askApi?: string;\n sitemap?: string;\n feeds?: string[];\n}\n\n/** The published `agent-readability.json` document. */\nexport interface AgentReadabilityManifest {\n artifacts: AgentArtifacts;\n description?: string;\n generator?: string;\n name: string;\n site: string | null;\n contentUsage?: Record<string, boolean>;\n repository?: string;\n}\n\n/**\n * The raw-Markdown mirror pattern. `Accept: text/markdown` negotiation is\n * advertised only where the deployed site actually honors it — a server build\n * on a platform that declares `negotiatesMarkdown` (Vercel, whose routing\n * config gets the rewrite rules; Cloudflare, whose deploy bundle gets a\n * wrapper Worker — see `deploy/platforms/*`). Static builds and other\n * adapters serve prerendered pages from a static layer with no request-time\n * hook, so agents there should fetch the `.md` pattern directly.\n */\nconst markdownArtifact = (\n config: BlumeProject[\"config\"],\n abs: (path: string) => string\n): AgentArtifacts[\"markdown\"] => {\n const negotiates =\n config.deployment.options.output === \"server\" &&\n deployPlatform(config.deployment).negotiatesMarkdown;\n return negotiates\n ? { contentNegotiation: \"text/markdown\", pattern: abs(\"/{route}.md\") }\n : { pattern: abs(\"/{route}.md\") };\n};\n\n/** The JSON docs API's entry points, or null when the API is off. */\nconst apiArtifact = (\n config: BlumeProject[\"config\"],\n abs: (path: string) => string\n): ApiArtifact | null => {\n if (!config.agents.api) {\n return null;\n }\n const api: ApiArtifact = {\n openapi: abs(OPENAPI_PATH),\n pages: abs(API_PAGES_PATH),\n };\n if (config.deployment.options.output === \"server\") {\n api.search = abs(API_SEARCH_PATH);\n }\n return api;\n};\n\n/** The `.well-known` discovery artifacts the site publishes, if any. */\nconst wellKnownArtifacts = (\n config: BlumeProject[\"config\"],\n abs: (path: string) => string\n): WellKnownArtifacts => {\n const artifacts: WellKnownArtifacts = {};\n if (config.agents.webBotAuth.keys.length > 0) {\n artifacts.httpMessageSignaturesDirectory = abs(\n \"/.well-known/http-message-signatures-directory\"\n );\n }\n if (hasAiCatalog(config)) {\n artifacts.aiCatalog = abs(AI_CATALOG_PATH);\n }\n if (hasApiCatalog(config)) {\n artifacts.apiCatalog = abs(\"/.well-known/api-catalog\");\n }\n if (servesSkillsIndex(config)) {\n artifacts.agentSkills = abs(\"/.well-known/agent-skills/index.json\");\n }\n return artifacts;\n};\n\n/**\n * Build `agent-readability.json`: a root manifest that indexes the project's\n * agent-facing surface — llms.txt, the raw-Markdown mirrors, the JSON docs\n * API and its OpenAPI description, the MCP server, the assistant, sitemap, and feeds\n * — so agents can discover and cite the docs without\n * scraping HTML. URLs are absolute when a `site` is configured and root-relative\n * (still under `deployment.base`) otherwise. Returns null when the manifest is\n * disabled.\n */\nexport const buildAgentReadability = (\n project: BlumeProject\n): AgentReadabilityManifest | null => {\n const { config } = project;\n if (!config.agents.agentReadability) {\n return null;\n }\n\n const site = config.deployment.options.site ?? null;\n // Every artifact is served under `deployment.base` — with or without a\n // `site`; concatenate rather than `new URL()` so the subpath is preserved.\n const deployBase = normalizeBasePath(config.deployment.options.base);\n const abs = (path: string): string => {\n const based = mountBasePath(deployBase, path);\n return site ? absoluteUrl(site, based) : based;\n };\n\n const artifacts: AgentArtifacts = {\n markdown: markdownArtifact(config, abs),\n };\n const api = apiArtifact(config, abs);\n if (api) {\n artifacts.api = api;\n }\n if (config.agents.llmsTxt.enabled) {\n artifacts.llmsFullTxt = abs(\"/llms-full.txt\");\n artifacts.llmsTxt = abs(\"/llms.txt\");\n }\n if (config.agents.mcp.enabled) {\n artifacts.mcp = {\n discovery: abs(\"/.well-known/mcp.json\"),\n url: abs(config.agents.mcp.route),\n };\n }\n if (config.ai.assistant?.enabled) {\n artifacts.askApi = askApiUrl(config.ai.assistant.endpoint, site, abs);\n }\n Object.assign(artifacts, wellKnownArtifacts(config, abs));\n if (site && config.seo.sitemap) {\n artifacts.sitemap = abs(\"/sitemap.xml\");\n }\n const feeds =\n site && config.seo.rss.enabled\n ? buildRssFeeds(project).map((feed) => abs(feed.path))\n : [];\n if (feeds.length > 0) {\n artifacts.feeds = feeds;\n }\n\n const version = project.manifest?.blumeVersion;\n const manifest: AgentReadabilityManifest = {\n artifacts,\n description: config.description,\n generator: version ? `blume@${version}` : undefined,\n name: config.agents.mcp.name ?? config.title,\n site,\n };\n\n const usage = usagePolicy(config.agents.contentSignals);\n if (usage) {\n manifest.contentUsage = usage;\n }\n if (config.github) {\n manifest.repository = repoUrl(config.github);\n }\n\n return manifest;\n};\n",
7
7
  "import { mountBasePath, normalizeBasePath } from \"../core/base-path.ts\";\nimport type { BlumeProject } from \"../core/project-graph.ts\";\nimport type { ContentSignalPolicy, ContentSignals } from \"../core/schema.ts\";\nimport { absoluteUrl } from \"../core/site-url.ts\";\n\n/**\n * Ordered mapping from config field to its `Content-Signal` token. The order\n * fixes the emitted sequence (`search`, then `ai-input`, then `ai-train`).\n */\nconst SIGNAL_TOKENS: [keyof ContentSignalPolicy, string][] = [\n [\"search\", \"search\"],\n [\"aiInput\", \"ai-input\"],\n [\"aiTrain\", \"ai-train\"],\n];\n\n/**\n * The `Content-Signal:` line declaring how crawlers may reuse the site, or null\n * when the declaration is disabled (`contentSignals: false`). Otherwise every\n * signal is emitted with its resolved yes/no value.\n */\nconst contentSignalLine = (signals: ContentSignals): string | null => {\n if (!signals) {\n return null;\n }\n const tokens = SIGNAL_TOKENS.map(\n ([key, token]) => `${token}=${signals[key] ? \"yes\" : \"no\"}`\n );\n return `Content-Signal: ${tokens.join(\", \")}`;\n};\n\n/**\n * Build a robots.txt that allows all crawlers, declares any configured\n * `Content-Signal` usage preferences, and points to the sitemap when one is\n * available (a `site` is set and the sitemap is enabled). Returns null when\n * robots generation is disabled.\n */\nexport const buildRobots = (project: BlumeProject): string | null => {\n const { config } = project;\n if (!config.seo.robots) {\n return null;\n }\n\n const lines = [\"User-agent: *\"];\n const signal = contentSignalLine(config.agents.contentSignals);\n if (signal) {\n lines.push(signal);\n }\n lines.push(\"Allow: /\");\n\n const { site } = config.deployment.options;\n if (site && config.seo.sitemap) {\n const sitemapPath = mountBasePath(\n normalizeBasePath(config.deployment.options.base),\n \"/sitemap.xml\"\n );\n lines.push(\"\", `Sitemap: ${absoluteUrl(site, sitemapPath)}`);\n }\n return `${lines.join(\"\\n\")}\\n`;\n};\n",
8
- "// html-escaper's five-entity table is XML-safe (`'` → the numeric `&#39;`).\nimport { escape as escapeXml } from \"html-escaper\";\n\nimport {\n customStaticRoutes,\n discoverPagesSync,\n hasGeneratedChangelog,\n} from \"../astro/pages.ts\";\nimport {\n mountBasePath,\n normalizeBasePath,\n normalizePath,\n} from \"../core/base-path.ts\";\nimport { isHiddenPage } from \"../core/hidden-pages.ts\";\nimport type { BlumeProject } from \"../core/project-graph.ts\";\nimport { siteRoot } from \"../core/site-url.ts\";\n\n/**\n * Astro's reserved error routes. A user-authored override (`pages/404.astro`,\n * `pages/500.astro`, or a `404.md` content page — see `writeNotFoundPage` in\n * `astro/generate.ts`) is neither dynamic nor private, so it would otherwise\n * be emitted — but error pages aren't crawlable destinations and must stay out\n * of the sitemap.\n */\nconst ERROR_ROUTES = new Set([\"/404\", \"/500\"]);\n\n/** A `<lastmod>` element (W3C date) when the page has a valid modified date. */\nconst lastmodTag = (value: string | undefined): string => {\n if (!value) {\n return \"\";\n }\n const date = new Date(value);\n return Number.isNaN(date.getTime())\n ? \"\"\n : `<lastmod>${date.toISOString().slice(0, 10)}</lastmod>`;\n};\n\n/**\n * Whether a page's own `seo.canonical` names another URL. The sitemap lists\n * canonical URLs only, so such a page stays out — `blume audit` reports a\n * listed one as NON_CANONICAL_IN_SITEMAP and expects it unlisted. Compared by\n * decoded path, as the audit does: `served` is the page's path with the\n * deployment base mounted, which the canonical carries too.\n */\nconst canonicalElsewhere = (\n canonical: string | undefined,\n served: string\n): boolean => {\n if (!canonical) {\n return false;\n }\n const { pathname } = new URL(canonical);\n let path = pathname;\n try {\n path = decodeURI(pathname);\n } catch {\n // A malformed escape stays as written; it can't match the served path.\n }\n return normalizePath(path) !== normalizePath(served);\n};\n\n/** One emitted sitemap artifact: its dist-root filename and XML body. */\nexport interface SitemapFile {\n name: string;\n xml: string;\n}\n\n/** The build log line for an emitted sitemap set: one file, or an index. */\nexport const describeSitemapFiles = (files: readonly SitemapFile[]): string =>\n files.length === 1\n ? \"Generated sitemap.xml\"\n : `Generated sitemap.xml (index of ${files.length - 1} sitemap files)`;\n\n/**\n * The sitemaps.org cap on `<url>` entries in a single file. Beyond it,\n * `sitemap.xml` becomes a sitemap index pointing at numbered chunk files —\n * search engines reject an oversized urlset outright.\n */\nconst URLS_PER_FILE = 50_000;\n\nconst renderUrlset = (\n urls: string[]\n): string => `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n${urls.join(\"\\n\")}\n</urlset>\n`;\n\n/**\n * Build the sitemap files from the route manifest plus the routes the manifest\n * can't see: custom `.astro` pages (most importantly a custom landing `/`) and\n * the generated `/changelog` index. Returns null when the sitemap is disabled\n * or no `site` is configured (absolute URLs are required for a valid sitemap).\n * Drafts, hidden, and `noindex` pages are excluded, and so is a page whose\n * `seo.canonical` points elsewhere.\n *\n * Sites within the per-file URL cap get the single classic `sitemap.xml`;\n * larger sites get `sitemap.xml` as a sitemap index over numbered\n * `sitemap-N.xml` chunks, all served from the same directory robots.txt\n * already points at.\n */\nexport const buildSitemapFiles = (\n project: BlumeProject\n): SitemapFile[] | null => {\n const { site } = project.config.deployment.options;\n if (!(site && project.config.seo.sitemap)) {\n return null;\n }\n\n const base = siteRoot(site);\n // Routes carry `basePath`; a `deployment.base` subdirectory is mounted on\n // top of every one, even a route whose first segment matches it: under base\n // `/guides`, `guides/setup.md` is served at `/guides/guides/setup`.\n const deployBase = normalizeBasePath(project.config.deployment.options.base);\n\n // Archived-version pages leave the sitemap when the version is noindexed,\n // or when their canonical points at a still-existing latest equivalent —\n // listing a URL whose canonical says \"index the other page\" invites the\n // noindexed-page-in-sitemap incoherence Docusaurus is known for. A page\n // that exists only in an archived version stays listed (self-canonical),\n // and a page's own `seo.canonical` wins over the version's default, as it\n // does in the page head (see `canonicalElsewhere`).\n const { versions } = project.config;\n const archivedById = new Map(\n (versions?.archived ?? []).map((version) => [version.id, version])\n );\n const currentKeys = versions\n ? new Set(\n project.graph.pages.flatMap((page) =>\n page.version === \"\" ? [`${page.versionKey}\\u0000${page.locale}`] : []\n )\n )\n : null;\n const archivedExcluded = (page: (typeof project.graph.pages)[number]) => {\n if (!page.version) {\n return false;\n }\n // A non-empty version always names a configured archived entry — that is\n // the only way detection assigns one.\n const archived = archivedById.get(page.version);\n return Boolean(\n archived?.noindex ||\n (archived?.canonical === \"latest\" &&\n !page.meta.seo.canonical &&\n currentKeys?.has(`${page.versionKey}\\u0000${page.locale}`))\n );\n };\n\n const seen = new Set<string>();\n const urls: string[] = [];\n const pushUrl = (route: string, lastModified?: string): void => {\n // `<loc>` must be a well-formed, XML-escaped URL: percent-encode the path,\n // then escape XML metacharacters (notably `&`) so a route like\n // `/Tips & Tricks` doesn't produce invalid XML that gets the whole sitemap\n // rejected.\n const loc = escapeXml(encodeURI(`${base}${route}`));\n if (seen.has(loc)) {\n return;\n }\n seen.add(loc);\n urls.push(` <url><loc>${loc}</loc>${lastmodTag(lastModified)}</url>`);\n };\n for (const page of project.graph.pages) {\n const served = mountBasePath(deployBase, page.route);\n if (\n page.meta.draft ||\n isHiddenPage(page, project.graph) ||\n page.meta.seo.noindex ||\n ERROR_ROUTES.has(page.route) ||\n archivedExcluded(page) ||\n canonicalElsewhere(page.meta.seo.canonical, served)\n ) {\n continue;\n }\n pushUrl(served, page.lastModified);\n }\n // Custom `.astro` pages and the generated changelog index mount outside\n // `basePath` (they're injected at their pattern — see `blumeIntegration`), so\n // only the deployment base layers onto their URLs.\n const userPages = project.context.pagesRoot\n ? discoverPagesSync(project.context.pagesRoot)\n : [];\n const extraRoutes = customStaticRoutes(userPages).filter(\n (route) => !ERROR_ROUTES.has(route)\n );\n if (hasGeneratedChangelog(project, userPages)) {\n extraRoutes.push(\"/changelog\");\n }\n for (const route of extraRoutes) {\n pushUrl(mountBasePath(deployBase, route));\n }\n urls.sort();\n\n if (urls.length <= URLS_PER_FILE) {\n return [{ name: \"sitemap.xml\", xml: renderUrlset(urls) }];\n }\n\n const chunks: SitemapFile[] = [];\n const references: string[] = [];\n for (let start = 0; start < urls.length; start += URLS_PER_FILE) {\n const name = `sitemap-${chunks.length + 1}.xml`;\n chunks.push({\n name,\n xml: renderUrlset(urls.slice(start, start + URLS_PER_FILE)),\n });\n // Chunks sit next to sitemap.xml, so their URLs layer the same deployment\n // base robots.txt uses for the index.\n const loc = escapeXml(\n encodeURI(`${base}${mountBasePath(deployBase, `/${name}`)}`)\n );\n references.push(` <sitemap><loc>${loc}</loc></sitemap>`);\n }\n const index = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<sitemapindex xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n${references.join(\"\\n\")}\n</sitemapindex>\n`;\n return [{ name: \"sitemap.xml\", xml: index }, ...chunks];\n};\n"
8
+ "// html-escaper's five-entity table is XML-safe (`'` → the numeric `&#39;`).\nimport { escape as escapeXml } from \"html-escaper\";\n\nimport {\n customStaticRoutes,\n discoverPagesSync,\n hasGeneratedChangelog,\n} from \"../astro/pages.ts\";\nimport {\n mountBasePath,\n normalizeBasePath,\n normalizePath,\n} from \"../core/base-path.ts\";\nimport { isHiddenPage } from \"../core/hidden-pages.ts\";\nimport type { BlumeProject } from \"../core/project-graph.ts\";\nimport { siteRoot } from \"../core/site-url.ts\";\nimport type { RouteAlternate } from \"../core/types.ts\";\n\n/**\n * Astro's reserved error routes. A user-authored override (`pages/404.astro`,\n * `pages/500.astro`, or a `404.md` content page — see `writeNotFoundPage` in\n * `astro/generate.ts`) is neither dynamic nor private, so it would otherwise\n * be emitted — but error pages aren't crawlable destinations and must stay out\n * of the sitemap.\n */\nconst ERROR_ROUTES = new Set([\"/404\", \"/500\"]);\n\n/** A `<lastmod>` element (W3C date) when the page has a valid modified date. */\nconst lastmodTag = (value: string | undefined): string => {\n if (!value) {\n return \"\";\n }\n const date = new Date(value);\n return Number.isNaN(date.getTime())\n ? \"\"\n : `<lastmod>${date.toISOString().slice(0, 10)}</lastmod>`;\n};\n\n/**\n * Whether a page's own `seo.canonical` names another URL. The sitemap lists\n * canonical URLs only, so such a page stays out — `blume audit` reports a\n * listed one as NON_CANONICAL_IN_SITEMAP and expects it unlisted. Compared by\n * decoded path, as the audit does: `served` is the page's path with the\n * deployment base mounted, which the canonical carries too.\n */\nconst canonicalElsewhere = (\n canonical: string | undefined,\n served: string\n): boolean => {\n if (!canonical) {\n return false;\n }\n const { pathname } = new URL(canonical);\n let path = pathname;\n try {\n path = decodeURI(pathname);\n } catch {\n // A malformed escape stays as written; it can't match the served path.\n }\n return normalizePath(path) !== normalizePath(served);\n};\n\n/** One emitted sitemap artifact: its dist-root filename and XML body. */\nexport interface SitemapFile {\n name: string;\n xml: string;\n}\n\n/** The build log line for an emitted sitemap set: one file, or an index. */\nexport const describeSitemapFiles = (files: readonly SitemapFile[]): string =>\n files.length === 1\n ? \"Generated sitemap.xml\"\n : `Generated sitemap.xml (index of ${files.length - 1} sitemap files)`;\n\n/**\n * The sitemaps.org cap on `<url>` entries in a single file. Beyond it,\n * `sitemap.xml` becomes a sitemap index pointing at numbered chunk files —\n * search engines reject an oversized urlset outright.\n */\nconst URLS_PER_FILE = 50_000;\n\nconst renderUrlset = (\n urls: string[],\n alternatesEnabled: boolean\n): string => `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"${alternatesEnabled ? ' xmlns:xhtml=\"http://www.w3.org/1999/xhtml\"' : \"\"}>\n${urls.join(\"\\n\")}\n</urlset>\n`;\n\n/**\n * The content pages crawlers may index under their own URL: drafts, hidden,\n * `noindex` (the page's or its archived version's), and error pages can't, nor\n * can a page whose own `seo.canonical` names another URL.\n */\nconst indexablePages = (\n project: BlumeProject\n): BlumeProject[\"graph\"][\"pages\"] => {\n const deployBase = normalizeBasePath(project.config.deployment.options.base);\n // A non-empty version always names a configured archived entry — that is\n // the only way detection assigns one.\n const noindexVersions = new Set(\n (project.config.versions?.archived ?? []).flatMap((version) =>\n version.noindex ? [version.id] : []\n )\n );\n return project.graph.pages.filter(\n (page) =>\n !page.meta.draft &&\n !isHiddenPage(page, project.graph) &&\n !page.meta.seo.noindex &&\n !noindexVersions.has(page.version) &&\n !ERROR_ROUTES.has(page.route) &&\n !canonicalElsewhere(\n page.meta.seo.canonical,\n mountBasePath(deployBase, page.route)\n )\n );\n};\n\n/**\n * The content pages the sitemap lists: the indexable ones, less archived-version\n * pages whose canonical points at a still-existing latest equivalent —\n * listing a URL whose canonical says \"index the other page\" invites the\n * noindexed-page-in-sitemap incoherence Docusaurus is known for. A page that\n * exists only in an archived version stays listed (self-canonical), and a\n * page's own `seo.canonical` wins over the version's default, as it does in\n * the page head (see `canonicalElsewhere`).\n */\nconst listedPages = (project: BlumeProject): BlumeProject[\"graph\"][\"pages\"] => {\n const latestVersions = new Set(\n (project.config.versions?.archived ?? []).flatMap((version) =>\n version.canonical === \"latest\" ? [version.id] : []\n )\n );\n const currentKeys = new Set(\n project.graph.pages.flatMap((page) =>\n page.version === \"\" ? [`${page.versionKey}\\u0000${page.locale}`] : []\n )\n );\n return indexablePages(project).filter(\n (page) =>\n !(\n latestVersions.has(page.version) &&\n !page.meta.seo.canonical &&\n currentKeys.has(`${page.versionKey}\\u0000${page.locale}`)\n )\n );\n};\n\n/**\n * Each route's hreflang set, keyed by route: its indexable translations. The\n * page head links it, and so does the sitemap under `seo.sitemap.alternates`,\n * so the two never disagree, and neither points crawlers at a page they're\n * told not to index. A page that can't be indexed joins no set — except an\n * i18n fallback copy, which links the translations it stands in for.\n */\nexport const hreflangAlternates = (\n project: BlumeProject\n): Map<string, RouteAlternate[]> => {\n const indexable = new Set(indexablePages(project).map((page) => page.route));\n return new Map(\n project.manifest.routes.map((route) => [\n route.path,\n route.fallback || indexable.has(route.path)\n ? route.alternates.filter((alternate) => indexable.has(alternate.path))\n : [],\n ])\n );\n};\n\n/**\n * Build the sitemap files from the route manifest plus the routes the manifest\n * can't see: custom `.astro` pages (most importantly a custom landing `/`) and\n * the generated `/changelog` index. Returns null when the sitemap is disabled\n * or no `site` is configured (absolute URLs are required for a valid sitemap).\n * Drafts, hidden, and `noindex` pages are excluded, and so is a page whose\n * `seo.canonical` points elsewhere.\n *\n * Sites within the per-file URL cap get the single classic `sitemap.xml`;\n * larger sites get `sitemap.xml` as a sitemap index over numbered\n * `sitemap-N.xml` chunks, all served from the same directory robots.txt\n * already points at.\n */\nexport const buildSitemapFiles = (\n project: BlumeProject\n): SitemapFile[] | null => {\n const { site } = project.config.deployment.options;\n if (!(site && project.config.seo.sitemap)) {\n return null;\n }\n\n const base = siteRoot(site);\n // Routes carry `basePath`; a `deployment.base` subdirectory is mounted on\n // top of every one, even a route whose first segment matches it: under base\n // `/guides`, `guides/setup.md` is served at `/guides/guides/setup`.\n const deployBase = normalizeBasePath(project.config.deployment.options.base);\n const alternatesEnabled =\n project.config.seo.sitemap !== true &&\n project.config.seo.sitemap.alternates;\n const hreflang = alternatesEnabled ? hreflangAlternates(project) : null;\n // A page's translations as `xhtml:link`s, plus `x-default` at the default\n // locale's — the same set the page head links, for pages in 2+ locales.\n const alternateTags = (route: string): string => {\n const alternates = hreflang?.get(route) ?? [];\n if (alternates.length < 2) {\n return \"\";\n }\n const defaultPage = alternates.find(\n (entry) => entry.locale === project.config.i18n?.defaultLocale\n );\n const links = defaultPage\n ? [...alternates, { ...defaultPage, locale: \"x-default\" }]\n : alternates;\n return links\n .map(\n (entry) =>\n `<xhtml:link rel=\"alternate\" hreflang=\"${escapeXml(entry.locale)}\" href=\"${escapeXml(encodeURI(`${base}${mountBasePath(deployBase, entry.path)}`))}\"/>`\n )\n .join(\"\");\n };\n\n const seen = new Set<string>();\n const urls: string[] = [];\n const pushUrl = (\n route: string,\n lastModified?: string,\n alternates = \"\"\n ): void => {\n // `<loc>` must be a well-formed, XML-escaped URL: percent-encode the path,\n // then escape XML metacharacters (notably `&`) so a route like\n // `/Tips & Tricks` doesn't produce invalid XML that gets the whole sitemap\n // rejected.\n const loc = escapeXml(encodeURI(`${base}${route}`));\n if (seen.has(loc)) {\n return;\n }\n seen.add(loc);\n urls.push(\n ` <url><loc>${loc}</loc>${lastmodTag(lastModified)}${alternates}</url>`\n );\n };\n for (const page of listedPages(project)) {\n pushUrl(\n mountBasePath(deployBase, page.route),\n page.lastModified,\n alternateTags(page.route)\n );\n }\n // Custom `.astro` pages and the generated changelog index mount outside\n // `basePath` (they're injected at their pattern — see `blumeIntegration`), so\n // only the deployment base layers onto their URLs.\n const userPages = project.context.pagesRoot\n ? discoverPagesSync(project.context.pagesRoot)\n : [];\n const extraRoutes = customStaticRoutes(userPages).filter(\n (route) => !ERROR_ROUTES.has(route)\n );\n if (hasGeneratedChangelog(project, userPages)) {\n extraRoutes.push(\"/changelog\");\n }\n for (const route of extraRoutes) {\n pushUrl(mountBasePath(deployBase, route));\n }\n urls.sort();\n\n if (urls.length <= URLS_PER_FILE) {\n return [\n { name: \"sitemap.xml\", xml: renderUrlset(urls, alternatesEnabled) },\n ];\n }\n\n const chunks: SitemapFile[] = [];\n const references: string[] = [];\n for (let start = 0; start < urls.length; start += URLS_PER_FILE) {\n const name = `sitemap-${chunks.length + 1}.xml`;\n chunks.push({\n name,\n xml: renderUrlset(\n urls.slice(start, start + URLS_PER_FILE),\n alternatesEnabled\n ),\n });\n // Chunks sit next to sitemap.xml, so their URLs layer the same deployment\n // base robots.txt uses for the index.\n const loc = escapeXml(\n encodeURI(`${base}${mountBasePath(deployBase, `/${name}`)}`)\n );\n references.push(` <sitemap><loc>${loc}</loc></sitemap>`);\n }\n const index = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<sitemapindex xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n${references.join(\"\\n\")}\n</sitemapindex>\n`;\n return [{ name: \"sitemap.xml\", xml: index }, ...chunks];\n};\n"
9
9
  ],
10
- "mappings": "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",
11
- "debugId": "AFE0F5252B96AD6064756E2164756E21",
10
+ "mappings": "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",
11
+ "debugId": "3DB9B0C9F36E00AB64756E2164756E21",
12
12
  "names": []
13
13
  }
@@ -9,7 +9,7 @@ import {
9
9
  import {
10
10
  AGENTS,
11
11
  launchInstalledAgent
12
- } from "./chunk-aafhwx74.js";
12
+ } from "./chunk-x25s4gph.js";
13
13
 
14
14
  // src/cli/commands/migrate.ts
15
15
  import { defineCommand } from "citty";
@@ -261,4 +261,4 @@ export {
261
261
  };
262
262
 
263
263
  //# debugId=7221C933F227E9F464756E2164756E21
264
- //# sourceMappingURL=chunk-yg8ckc3g.js.map
264
+ //# sourceMappingURL=chunk-88zkpg89.js.map
@@ -7,7 +7,7 @@ import {
7
7
  hasGeneratedChangelog,
8
8
  buildManifest,
9
9
  validateLinks
10
- } from "./chunk-r5nm9w0c.js";
10
+ } from "./chunk-hwjspffr.js";
11
11
  import {
12
12
  commandMeta,
13
13
  reportInternalError,
@@ -19,17 +19,17 @@ import {
19
19
  } from "./index.js";
20
20
  import {
21
21
  scanProject
22
- } from "./chunk-zxd5jrgx.js";
22
+ } from "./chunk-gc7knd2s.js";
23
23
  import {
24
24
  normalizeBasePath
25
25
  } from "./chunk-zccbjcj0.js";
26
26
  import {
27
27
  generatedFilePaths
28
- } from "./chunk-487b95qy.js";
28
+ } from "./chunk-88q28zav.js";
29
29
  import {
30
30
  parseIgnoreFlag
31
- } from "./chunk-fnxgtjeq.js";
32
- import"./chunk-q1wwrxzw.js";
31
+ } from "./chunk-c0qddrxr.js";
32
+ import"./chunk-rc2qk3qx.js";
33
33
 
34
34
  // src/cli/commands/validate.ts
35
35
  import { defineCommand } from "citty";
@@ -122,4 +122,4 @@ export {
122
122
  };
123
123
 
124
124
  //# debugId=0B908AF983A1FB4C64756E2164756E21
125
- //# sourceMappingURL=chunk-ppa6mg4d.js.map
125
+ //# sourceMappingURL=chunk-8fm3b4vm.js.map
@@ -4,7 +4,7 @@ import {
4
4
  BUILTIN_CHILD_PROPS,
5
5
  commandsFor,
6
6
  detectProjectPackageManager
7
- } from "./chunk-r5nm9w0c.js";
7
+ } from "./chunk-hwjspffr.js";
8
8
  import {
9
9
  packageRoot
10
10
  } from "./index.js";
@@ -307,4 +307,4 @@ var missingDependencyDiagnostic = async (config, root, severity, frameworks = []
307
307
  export { validateUsedComponents, unknownPropDiagnostics, missingExampleDiagnostics, discoverIslands, EXAMPLE_SCAN_GLOB, exampleScanRoots, discoverExamples, exampleMarkdownLookup, missingDependencyDiagnostic };
308
308
 
309
309
  //# debugId=01581CA3D72AB06264756E2164756E21
310
- //# sourceMappingURL=chunk-rtvgmg2j.js.map
310
+ //# sourceMappingURL=chunk-8h2t2vyj.js.map
@@ -21,7 +21,7 @@ import {
21
21
  writeAgentReport,
22
22
  fixPrompt,
23
23
  launchInstalledAgent
24
- } from "./chunk-aafhwx74.js";
24
+ } from "./chunk-x25s4gph.js";
25
25
  import {
26
26
  routeSetFor,
27
27
  frontmatter_default,
@@ -40,7 +40,7 @@ import {
40
40
  labelOn,
41
41
  resolveAccent,
42
42
  resolveAction
43
- } from "./chunk-r5nm9w0c.js";
43
+ } from "./chunk-hwjspffr.js";
44
44
  import {
45
45
  normalizeBasePath,
46
46
  normalizePath,
@@ -49,13 +49,13 @@ import {
49
49
  import {
50
50
  deployStaticDir,
51
51
  examplesRouteBase
52
- } from "./chunk-k45sq16q.js";
52
+ } from "./chunk-0xyedh7k.js";
53
53
  import {
54
54
  scanProject
55
- } from "./chunk-zxd5jrgx.js";
55
+ } from "./chunk-gc7knd2s.js";
56
56
  import {
57
57
  parseIgnoreFlag
58
- } from "./chunk-fnxgtjeq.js";
58
+ } from "./chunk-c0qddrxr.js";
59
59
 
60
60
  // src/cli/commands/audit.ts
61
61
  import { defineCommand } from "citty";
@@ -2314,4 +2314,4 @@ export {
2314
2314
  };
2315
2315
 
2316
2316
  //# debugId=00C4E028AC9C126964756E2164756E21
2317
- //# sourceMappingURL=chunk-2ssh60qh.js.map
2317
+ //# sourceMappingURL=chunk-982qfeny.js.map
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  packageDirFrom,
4
4
  generateRuntime
5
- } from "./chunk-hktq4j5r.js";
5
+ } from "./chunk-pxp1y6yz.js";
6
6
  import {
7
7
  loadEnvFiles,
8
8
  reportInternalError,
@@ -13,11 +13,11 @@ import {
13
13
  } from "./index.js";
14
14
  import {
15
15
  scanProject
16
- } from "./chunk-zxd5jrgx.js";
16
+ } from "./chunk-gc7knd2s.js";
17
17
  import {
18
18
  serverFeatures,
19
19
  checkRequiredSecrets
20
- } from "./chunk-gwy55cx3.js";
20
+ } from "./chunk-426rytg6.js";
21
21
 
22
22
  // src/cli/yarn-pnp.ts
23
23
  import { existsSync } from "node:fs";
@@ -121,4 +121,4 @@ var prepareProject = async (options) => {
121
121
  export { prepareProject };
122
122
 
123
123
  //# debugId=0B8AEED1A551B5FA64756E2164756E21
124
- //# sourceMappingURL=chunk-t2h8pwy1.js.map
124
+ //# sourceMappingURL=chunk-9emfspcp.js.map
@@ -11,17 +11,17 @@ import {
11
11
  import {
12
12
  AGENTS,
13
13
  launchAgent
14
- } from "./chunk-aafhwx74.js";
14
+ } from "./chunk-x25s4gph.js";
15
15
  import {
16
16
  YAML_SCHEMA
17
- } from "./chunk-r5nm9w0c.js";
17
+ } from "./chunk-hwjspffr.js";
18
18
  import {
19
19
  scanProject
20
- } from "./chunk-zxd5jrgx.js";
20
+ } from "./chunk-gc7knd2s.js";
21
21
  import"./chunk-zccbjcj0.js";
22
22
  import {
23
23
  buildMcpData
24
- } from "./chunk-b680sv30.js";
24
+ } from "./chunk-2f6btenb.js";
25
25
  import {
26
26
  seconds,
27
27
  money,
@@ -34,7 +34,7 @@ import {
34
34
  } from "./chunk-0n9xkp3d.js";
35
35
  import {
36
36
  parseTimeoutSeconds
37
- } from "./chunk-fnxgtjeq.js";
37
+ } from "./chunk-c0qddrxr.js";
38
38
 
39
39
  // src/cli/commands/eval.ts
40
40
  import { existsSync } from "node:fs";
@@ -698,4 +698,4 @@ export {
698
698
  };
699
699
 
700
700
  //# debugId=A08E98490DA10DBB64756E2164756E21
701
- //# sourceMappingURL=chunk-9jqmq5hv.js.map
701
+ //# sourceMappingURL=chunk-akj2p7k1.js.map
@@ -2,36 +2,36 @@
2
2
  import {
3
3
  ensureGitignore
4
4
  } from "./chunk-yzhm0j9q.js";
5
- import"./chunk-r5nm9w0c.js";
5
+ import"./chunk-hwjspffr.js";
6
6
  import {
7
7
  commandMeta,
8
8
  logger,
9
9
  reportDiagnostics
10
10
  } from "./index.js";
11
- import"./chunk-zxd5jrgx.js";
11
+ import"./chunk-gc7knd2s.js";
12
12
  import {
13
13
  astroBuildDiagnostics
14
- } from "./chunk-4zxh25hc.js";
14
+ } from "./chunk-zgca0vxs.js";
15
15
  import {
16
16
  refuseIfDevRunning
17
- } from "./chunk-h0qwdbem.js";
17
+ } from "./chunk-r5ajrw1g.js";
18
18
  import"./chunk-zccbjcj0.js";
19
- import"./chunk-k45sq16q.js";
19
+ import"./chunk-0xyedh7k.js";
20
20
  import {
21
21
  refuseIfEjected
22
- } from "./chunk-e1n41w9m.js";
23
- import"./chunk-hktq4j5r.js";
24
- import"./chunk-b680sv30.js";
25
- import"./chunk-rtvgmg2j.js";
26
- import"./chunk-j4nfgn2j.js";
22
+ } from "./chunk-1ay3hzn0.js";
23
+ import"./chunk-pxp1y6yz.js";
24
+ import"./chunk-2f6btenb.js";
25
+ import"./chunk-8h2t2vyj.js";
26
+ import"./chunk-znwhf37a.js";
27
27
  import"./chunk-jq5n4avg.js";
28
- import"./chunk-487b95qy.js";
29
- import"./chunk-9h8mh2tk.js";
28
+ import"./chunk-88q28zav.js";
29
+ import"./chunk-5f96yq2c.js";
30
30
  import {
31
31
  prepareProject
32
- } from "./chunk-t2h8pwy1.js";
33
- import"./chunk-gwy55cx3.js";
34
- import"./chunk-q1wwrxzw.js";
32
+ } from "./chunk-9emfspcp.js";
33
+ import"./chunk-426rytg6.js";
34
+ import"./chunk-rc2qk3qx.js";
35
35
 
36
36
  // src/cli/commands/check.ts
37
37
  import { existsSync } from "node:fs";
@@ -102,4 +102,4 @@ export {
102
102
  };
103
103
 
104
104
  //# debugId=2169D092EE0AE81964756E2164756E21
105
- //# sourceMappingURL=chunk-beb0z983.js.map
105
+ //# sourceMappingURL=chunk-b664x65a.js.map
@@ -8,11 +8,11 @@ import {
8
8
  VERSION_ID,
9
9
  VERSION_LIKE,
10
10
  versionizeRoute
11
- } from "./chunk-r5nm9w0c.js";
11
+ } from "./chunk-hwjspffr.js";
12
12
  import {
13
13
  isWithin,
14
14
  scanProject
15
- } from "./chunk-zxd5jrgx.js";
15
+ } from "./chunk-gc7knd2s.js";
16
16
  import {
17
17
  mountBasePath,
18
18
  stripBasePath
@@ -280,4 +280,4 @@ var cutVersion = async (root, id, options = {}) => {
280
280
  export { CutError, unregisteredSnapshotDiagnostics, cutVersion };
281
281
 
282
282
  //# debugId=1864DE871652686F64756E2164756E21
283
- //# sourceMappingURL=chunk-kmswjxj9.js.map
283
+ //# sourceMappingURL=chunk-b7n58hgj.js.map
@@ -62,4 +62,4 @@ var parseTimeoutSeconds = (value, fallback) => {
62
62
  export { parsePort, parseIgnoreFlag, parseTimeoutSeconds };
63
63
 
64
64
  //# debugId=1CED8804CB94605564756E2164756E21
65
- //# sourceMappingURL=chunk-fnxgtjeq.js.map
65
+ //# sourceMappingURL=chunk-c0qddrxr.js.map
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import"./chunk-r5nm9w0c.js";
2
+ import"./chunk-hwjspffr.js";
3
3
  import {
4
4
  packageRoot,
5
5
  getBlumeVersion,
@@ -13,13 +13,13 @@ import"./chunk-zccbjcj0.js";
13
13
  import {
14
14
  AGENTS,
15
15
  launchInstalledAgent
16
- } from "./chunk-aafhwx74.js";
16
+ } from "./chunk-x25s4gph.js";
17
17
  import {
18
18
  scanProject
19
- } from "./chunk-zxd5jrgx.js";
19
+ } from "./chunk-gc7knd2s.js";
20
20
  import {
21
21
  siteSkillName
22
- } from "./chunk-q1wwrxzw.js";
22
+ } from "./chunk-rc2qk3qx.js";
23
23
 
24
24
  // src/cli/commands/skill.ts
25
25
  import { defineCommand } from "citty";
@@ -123,4 +123,4 @@ export {
123
123
  };
124
124
 
125
125
  //# debugId=8BB2AE139A5F70AE64756E2164756E21
126
- //# sourceMappingURL=chunk-p834rkcn.js.map
126
+ //# sourceMappingURL=chunk-g62vnvaw.js.map
@@ -90,7 +90,7 @@ import {
90
90
  createModuleLoader,
91
91
  resolveProjectContext,
92
92
  loadConfig
93
- } from "./chunk-r5nm9w0c.js";
93
+ } from "./chunk-hwjspffr.js";
94
94
  import {
95
95
  BlumeError,
96
96
  locatePath,
@@ -1113,9 +1113,11 @@ var GIT_LOCATION_VARS = new Set([
1113
1113
  var gitEnv = () => Object.fromEntries(Object.entries(process.env).filter(([key]) => !GIT_LOCATION_VARS.has(key)));
1114
1114
  var resolveLastModifiedConfig = (value) => value === false ? { enabled: false, source: "git" } : { enabled: true, source: value };
1115
1115
  var parseGitLog = (output) => {
1116
- const times = new Map;
1116
+ const modified = new Map;
1117
+ const published = new Map;
1117
1118
  const currentNames = new Map;
1118
1119
  const renamedAt = new Map;
1120
+ const added = new Set;
1119
1121
  let current = null;
1120
1122
  for (const line of output.split(`
1121
1123
  `)) {
@@ -1129,21 +1131,27 @@ var parseGitLog = (output) => {
1129
1131
  continue;
1130
1132
  }
1131
1133
  const name = currentNames.get(path) ?? path;
1134
+ if (!added.has(name)) {
1135
+ published.set(name, current);
1136
+ if (status === "A") {
1137
+ added.add(name);
1138
+ }
1139
+ }
1132
1140
  if (status.startsWith("R")) {
1133
1141
  currentNames.set(from, name);
1134
1142
  if (!renamedAt.has(name)) {
1135
1143
  renamedAt.set(name, current);
1136
1144
  }
1137
- } else if (!times.has(name)) {
1138
- times.set(name, current);
1145
+ } else if (!modified.has(name)) {
1146
+ modified.set(name, current);
1139
1147
  }
1140
1148
  }
1141
1149
  for (const [name, date] of renamedAt) {
1142
- if (!times.has(name)) {
1143
- times.set(name, date);
1150
+ if (!modified.has(name)) {
1151
+ modified.set(name, date);
1144
1152
  }
1145
1153
  }
1146
- return times;
1154
+ return { modified, published };
1147
1155
  };
1148
1156
  var realPath = (path) => {
1149
1157
  try {
@@ -1159,13 +1167,14 @@ var gitRepositoryRoot = (root) => {
1159
1167
  return null;
1160
1168
  }
1161
1169
  };
1162
- var gitLastModifiedTimes = (root, contentRoots, sourcePaths, repositoryRoot) => {
1170
+ var noDates = () => ({ modified: new Map, published: new Map });
1171
+ var gitFileDates = (root, contentRoots, sourcePaths, repositoryRoot) => {
1163
1172
  if (sourcePaths.length === 0 || contentRoots.length === 0) {
1164
- return new Map;
1173
+ return noDates();
1165
1174
  }
1166
1175
  const gitRoot = repositoryRoot === undefined ? gitRepositoryRoot(root) : repositoryRoot;
1167
1176
  if (gitRoot === null) {
1168
- return new Map;
1177
+ return noDates();
1169
1178
  }
1170
1179
  const top = realPath(gitRoot);
1171
1180
  try {
@@ -1182,16 +1191,19 @@ var gitLastModifiedTimes = (root, contentRoots, sourcePaths, repositoryRoot) =>
1182
1191
  ...contentRoots.map(realPath)
1183
1192
  ], { encoding: "utf-8", env: gitEnv(), maxBuffer: 256 * 1024 * 1024 });
1184
1193
  const byRepoPath = parseGitLog(output);
1185
- const result = new Map;
1194
+ const result = noDates();
1186
1195
  for (const sourcePath of sourcePaths) {
1187
- const iso = byRepoPath.get(relative(top, realPath(sourcePath)));
1188
- if (iso) {
1189
- result.set(sourcePath, iso);
1196
+ const repoPath = relative(top, realPath(sourcePath));
1197
+ for (const key of ["modified", "published"]) {
1198
+ const iso = byRepoPath[key].get(repoPath);
1199
+ if (iso) {
1200
+ result[key].set(sourcePath, iso);
1201
+ }
1190
1202
  }
1191
1203
  }
1192
1204
  return result;
1193
1205
  } catch {
1194
- return new Map;
1206
+ return noDates();
1195
1207
  }
1196
1208
  };
1197
1209
  var isShallowGitRepository = (root) => {
@@ -1205,6 +1217,7 @@ var isShallowGitRepository = (root) => {
1205
1217
  return false;
1206
1218
  }
1207
1219
  };
1220
+ var SHALLOW_CLONE_SUGGESTION = "Fetch full history in CI: set the VERCEL_DEEP_CLONE=true environment variable on Vercel, or fetch-depth: 0 for actions/checkout.";
1208
1221
  var lastModifiedShallowWarning = (root, undatedCount) => {
1209
1222
  if (undatedCount === 0 || !isShallowGitRepository(root)) {
1210
1223
  return [];
@@ -1214,10 +1227,18 @@ var lastModifiedShallowWarning = (root, undatedCount) => {
1214
1227
  code: "BLUME_SHALLOW_GIT_HISTORY",
1215
1228
  message: `lastModified is on, but this build runs in a shallow git clone, so ${undatedCount} page(s) have no git-derived date — their sitemap <lastmod> and "Last updated" stamps are omitted.`,
1216
1229
  severity: "warning",
1217
- suggestion: "Fetch full history in CI: set the VERCEL_DEEP_CLONE=true environment variable on Vercel, or fetch-depth: 0 for actions/checkout."
1230
+ suggestion: SHALLOW_CLONE_SUGGESTION
1218
1231
  }
1219
1232
  ];
1220
1233
  };
1234
+ var datePublishedShallowWarning = (undatedCount) => undatedCount === 0 ? [] : [
1235
+ {
1236
+ code: "BLUME_SHALLOW_GIT_HISTORY",
1237
+ message: `seo.datePublished is "git", but this build runs in a shallow git clone, so ${undatedCount} page(s) without a front matter date have no datePublished.`,
1238
+ severity: "warning",
1239
+ suggestion: SHALLOW_CLONE_SUGGESTION
1240
+ }
1241
+ ];
1221
1242
 
1222
1243
  // src/core/mdx-syntax.ts
1223
1244
  import { readFile } from "node:fs/promises";
@@ -4593,6 +4614,41 @@ var gitContentRoots = (sources, gitRoot) => {
4593
4614
  const top = realPath(gitRoot);
4594
4615
  return sources.flatMap((source) => source.contentRoot ? [source.contentRoot] : []).filter((dir) => isWithin(top, realPath(dir)));
4595
4616
  };
4617
+ var hasPublishedDate = (page) => Boolean(page.meta.date ?? page.meta.changelog?.date);
4618
+ var applyGitDates = (pages, sources, root, config) => {
4619
+ const lastModified = resolveLastModifiedConfig(config.lastModified);
4620
+ const gitModified = lastModified.enabled && lastModified.source === "git";
4621
+ const gitPublished = config.seo.datePublished === "git";
4622
+ if (!(gitModified || gitPublished)) {
4623
+ return [];
4624
+ }
4625
+ const fsPaths = pages.map((page) => page.sourcePath).filter((path) => path !== undefined);
4626
+ const gitRoot = gitRepositoryRoot(root);
4627
+ const contentRoots = gitContentRoots(sources, gitRoot);
4628
+ const gitDates = gitFileDates(root, contentRoots, fsPaths, gitRoot);
4629
+ const datable = pages.filter((page) => page.sourcePath && contentRoots.some((dir) => isWithin(dir, page.sourcePath ?? "")));
4630
+ const warnings = [];
4631
+ if (gitModified) {
4632
+ for (const page of pages) {
4633
+ if (!page.lastModified && page.sourcePath) {
4634
+ page.lastModified = gitDates.modified.get(page.sourcePath);
4635
+ }
4636
+ }
4637
+ warnings.push(...lastModifiedShallowWarning(root, datable.filter((page) => !page.lastModified).length));
4638
+ }
4639
+ if (gitPublished) {
4640
+ const shallow = isShallowGitRepository(root);
4641
+ for (const page of pages) {
4642
+ if (!(shallow || hasPublishedDate(page)) && page.sourcePath) {
4643
+ page.published = gitDates.published.get(page.sourcePath);
4644
+ }
4645
+ }
4646
+ if (shallow) {
4647
+ warnings.push(...datePublishedShallowWarning(datable.filter((page) => !hasPublishedDate(page)).length));
4648
+ }
4649
+ }
4650
+ return warnings;
4651
+ };
4596
4652
  var isLogoShorthand = (logo) => typeof logo === "string";
4597
4653
  var logoHref = (logo) => logo === undefined || isLogoShorthand(logo) ? "/" : logo.href ?? "/";
4598
4654
  var isBannerShorthand = (banner) => typeof banner === "string";
@@ -4765,21 +4821,7 @@ var scanProject = async (root, options = {}) => {
4765
4821
  versionDirs: config.versions?.archived.map((version) => version.id)
4766
4822
  });
4767
4823
  const pages = mode === "build" && !preview ? allPages.filter((page) => !page.meta.draft) : allPages;
4768
- const lastModified = resolveLastModifiedConfig(config.lastModified);
4769
- const lastModifiedWarnings = [];
4770
- if (lastModified.enabled && lastModified.source === "git") {
4771
- const fsPaths = pages.map((page) => page.sourcePath).filter((path) => path !== undefined);
4772
- const gitRoot = gitRepositoryRoot(context.root);
4773
- const contentRoots = gitContentRoots(sources, gitRoot);
4774
- const gitTimes = gitLastModifiedTimes(context.root, contentRoots, fsPaths, gitRoot);
4775
- for (const page of pages) {
4776
- if (!page.lastModified && page.sourcePath) {
4777
- page.lastModified = gitTimes.get(page.sourcePath);
4778
- }
4779
- }
4780
- const undated = pages.filter((page) => page.sourcePath && !page.lastModified && contentRoots.some((dir) => isWithin(dir, page.sourcePath ?? ""))).length;
4781
- lastModifiedWarnings.push(...lastModifiedShallowWarning(context.root, undated));
4782
- }
4824
+ const gitDateWarnings = applyGitDates(pages, sources, context.root, config);
4783
4825
  const customPages = context.pagesRoot ? await discoverPages(context.pagesRoot) : [];
4784
4826
  const extraRoutes = new Set([
4785
4827
  ...customStaticRoutes(customPages),
@@ -4822,7 +4864,7 @@ var scanProject = async (root, options = {}) => {
4822
4864
  ...graph.diagnostics,
4823
4865
  ...i18nWarnings,
4824
4866
  ...versionWarnings,
4825
- ...lastModifiedWarnings,
4867
+ ...gitDateWarnings,
4826
4868
  ...svgWarnings,
4827
4869
  ...publicOpenApiDiagnostics(config, context.root),
4828
4870
  ...redirectPageDiagnostics(config, servedPaths, routeSetFor(manifest.routes), context.configFile)
@@ -4839,5 +4881,5 @@ var scanProject = async (root, options = {}) => {
4839
4881
 
4840
4882
  export { directiveSource, normalizeFence, QUOTED_ATTR, metaTokens, RESERVED_META_KEYWORDS, isForeignKeyword, isLineRange, validateSearchPopularIcons, validateMcpClientIcons, validateNavTargets, gitEnv, realPath, gitRepositoryRoot, locateMdxFailure, findFolderMetaFiles, isWithin, scanProject };
4841
4883
 
4842
- //# debugId=76845D03AD74A31664756E2164756E21
4843
- //# sourceMappingURL=chunk-zxd5jrgx.js.map
4884
+ //# debugId=C199F41EFA089E4F64756E2164756E21
4885
+ //# sourceMappingURL=chunk-gc7knd2s.js.map