blume 2.0.1 → 2.0.2

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 (410) hide show
  1. package/CHANGELOG.md +82 -0
  2. package/dist/cli/{chunk-vtk4a6dg.js → chunk-00gs3wqs.js} +1 -1
  3. package/dist/cli/{chunk-fa25z98p.js → chunk-273ygyr4.js} +4 -3
  4. package/dist/cli/chunk-273ygyr4.js.map +11 -0
  5. package/dist/cli/{chunk-yw7dm696.js → chunk-3yce002v.js} +21 -8
  6. package/dist/cli/{chunk-yw7dm696.js.map → chunk-3yce002v.js.map} +3 -3
  7. package/dist/cli/{chunk-yt5n7ppj.js → chunk-4e9b9ra6.js} +17 -7
  8. package/dist/cli/chunk-4e9b9ra6.js.map +10 -0
  9. package/dist/cli/{chunk-fs23ddbb.js → chunk-5r8g91qn.js} +352 -676
  10. package/dist/cli/chunk-5r8g91qn.js.map +34 -0
  11. package/dist/cli/{chunk-6vm74dry.js → chunk-6dtt0zfn.js} +8 -8
  12. package/dist/cli/{chunk-qwsrynx5.js → chunk-6k4ftwze.js} +38 -19
  13. package/dist/cli/{chunk-qwsrynx5.js.map → chunk-6k4ftwze.js.map} +4 -4
  14. package/dist/cli/{chunk-qs4q5p4e.js → chunk-7mbqtmgb.js} +16 -7
  15. package/dist/cli/chunk-7mbqtmgb.js.map +10 -0
  16. package/dist/cli/{chunk-q5163e60.js → chunk-7vtckvaw.js} +21 -19
  17. package/dist/cli/chunk-7vtckvaw.js.map +11 -0
  18. package/dist/cli/{chunk-kdp5q7ke.js → chunk-8g8ytmgx.js} +17 -18
  19. package/dist/cli/{chunk-kdp5q7ke.js.map → chunk-8g8ytmgx.js.map} +2 -2
  20. package/dist/cli/{chunk-epjnccmv.js → chunk-91ws1n6j.js} +18 -15
  21. package/dist/cli/chunk-91ws1n6j.js.map +10 -0
  22. package/dist/cli/{chunk-fxypxtvm.js → chunk-bbnwccaz.js} +2 -2
  23. package/dist/cli/{chunk-m3vmjgmq.js → chunk-bfwp9vp6.js} +16 -8
  24. package/dist/cli/chunk-bfwp9vp6.js.map +10 -0
  25. package/dist/cli/{chunk-f2z5v128.js → chunk-d1v5rhy0.js} +14 -15
  26. package/dist/cli/{chunk-f2z5v128.js.map → chunk-d1v5rhy0.js.map} +2 -2
  27. package/dist/cli/{chunk-6crbhc3x.js → chunk-ddndchfr.js} +21 -6
  28. package/dist/cli/chunk-ddndchfr.js.map +14 -0
  29. package/dist/cli/{chunk-ce574jw2.js → chunk-esh98wmb.js} +1 -1
  30. package/dist/cli/{chunk-zxcczpyx.js → chunk-fsmrqk8a.js} +1 -1
  31. package/dist/cli/{chunk-hdpx1tax.js → chunk-g698a744.js} +5 -5
  32. package/dist/cli/{chunk-jts8mvcz.js → chunk-gs7r695n.js} +9 -3
  33. package/dist/cli/{chunk-jts8mvcz.js.map → chunk-gs7r695n.js.map} +3 -3
  34. package/dist/cli/{chunk-zxh4d9vy.js → chunk-h2ez8dzb.js} +4 -4
  35. package/dist/cli/{chunk-5shv93fd.js → chunk-h7k3nq3v.js} +2 -2
  36. package/dist/cli/{chunk-79jhk4py.js → chunk-hqp2ajnh.js} +251 -122
  37. package/dist/cli/chunk-hqp2ajnh.js.map +35 -0
  38. package/dist/cli/{chunk-2hn4b8z7.js → chunk-hr8ne106.js} +109 -40
  39. package/dist/cli/chunk-hr8ne106.js.map +13 -0
  40. package/dist/cli/{chunk-6hsn950k.js → chunk-j85scx15.js} +62 -18
  41. package/dist/cli/chunk-j85scx15.js.map +10 -0
  42. package/dist/cli/{chunk-s1p84fyh.js → chunk-k7pj68a8.js} +63 -22
  43. package/dist/cli/chunk-k7pj68a8.js.map +11 -0
  44. package/dist/cli/{chunk-ah61y8py.js → chunk-mqc662a6.js} +2 -2
  45. package/dist/cli/{chunk-ch6g3ar0.js → chunk-n1yg3tj3.js} +4 -4
  46. package/dist/cli/{chunk-mb2919y2.js → chunk-nfcyttvj.js} +17 -6
  47. package/dist/cli/chunk-nfcyttvj.js.map +10 -0
  48. package/dist/cli/{chunk-kpf8rrjc.js → chunk-pbg5a4s3.js} +56 -24
  49. package/dist/cli/chunk-pbg5a4s3.js.map +19 -0
  50. package/dist/cli/{chunk-jwyddg7y.js → chunk-ppzjqwx2.js} +21 -14
  51. package/dist/cli/{chunk-jwyddg7y.js.map → chunk-ppzjqwx2.js.map} +4 -4
  52. package/dist/cli/{chunk-dh8cwk36.js → chunk-qkb5a8sa.js} +24 -9
  53. package/dist/cli/chunk-qkb5a8sa.js.map +10 -0
  54. package/dist/cli/{chunk-wm7js3j9.js → chunk-sqw4ekg1.js} +2 -2
  55. package/dist/cli/{chunk-qkqwkpte.js → chunk-v6ya5kcb.js} +3083 -953
  56. package/dist/cli/chunk-v6ya5kcb.js.map +189 -0
  57. package/dist/cli/{chunk-fz5wtpmh.js → chunk-w4bxdvsa.js} +18 -15
  58. package/dist/cli/chunk-w4bxdvsa.js.map +10 -0
  59. package/dist/cli/{chunk-27g6wdth.js → chunk-wdrt2k2v.js} +2 -2
  60. package/dist/cli/{chunk-wgm7m9qk.js → chunk-xh43dwgw.js} +158 -43
  61. package/dist/cli/chunk-xh43dwgw.js.map +36 -0
  62. package/dist/cli/{chunk-s6jhgk0q.js → chunk-zp79m0ts.js} +2 -2
  63. package/dist/cli/index.js +160 -35
  64. package/dist/cli/index.js.map +4 -4
  65. package/dist/types/ai/agent-surface.d.ts +32 -0
  66. package/dist/types/ai/api-catalog.d.ts +7 -1
  67. package/dist/types/ai/ask-context.d.ts +7 -0
  68. package/dist/types/ai/component-markdown.d.ts +4 -4
  69. package/dist/types/ai/relative-links.d.ts +9 -4
  70. package/dist/types/ai/static-expression.d.ts +28 -0
  71. package/dist/types/analytics/databuddy.d.ts +43 -0
  72. package/dist/types/analytics/index.d.ts +2 -0
  73. package/dist/types/analytics/schema.d.ts +14 -0
  74. package/dist/types/cli/env.d.ts +5 -0
  75. package/dist/types/cli/init/scaffold.d.ts +19 -3
  76. package/dist/types/cli/init/starter-spec.d.ts +11 -0
  77. package/dist/types/core/base-path.d.ts +9 -0
  78. package/dist/types/core/config-input.d.ts +4 -4
  79. package/dist/types/core/config.d.ts +2 -2
  80. package/dist/types/core/graph.d.ts +2 -0
  81. package/dist/types/core/i18n-ui.d.ts +31 -0
  82. package/dist/types/core/i18n.d.ts +7 -1
  83. package/dist/types/core/links.d.ts +3 -1
  84. package/dist/types/core/load-module.d.ts +10 -0
  85. package/dist/types/core/locale-links.d.ts +12 -2
  86. package/dist/types/core/meta.d.ts +5 -1
  87. package/dist/types/core/nav-diagnostics.d.ts +10 -0
  88. package/dist/types/core/navigation.d.ts +38 -0
  89. package/dist/types/core/ordering-prefix.d.ts +4 -0
  90. package/dist/types/core/safe-links.d.ts +3 -1
  91. package/dist/types/core/schema.d.ts +52 -13
  92. package/dist/types/core/sources/github-releases.d.ts +5 -0
  93. package/dist/types/core/sources/lower.d.ts +14 -2
  94. package/dist/types/core/sources/normalize.d.ts +10 -1
  95. package/dist/types/core/sources/remote.d.ts +11 -1
  96. package/dist/types/core/sources/resolve.d.ts +12 -0
  97. package/dist/types/core/sources/types.d.ts +31 -0
  98. package/dist/types/core/types.d.ts +9 -0
  99. package/dist/types/deploy/adapters/node.d.ts +5 -2
  100. package/dist/types/deploy/adapters/types.d.ts +7 -0
  101. package/dist/types/deploy/cloudflare-negotiation.d.ts +3 -2
  102. package/dist/types/deploy/headers.d.ts +31 -7
  103. package/dist/types/deploy/node-headers.d.ts +43 -8
  104. package/dist/types/deploy/platforms/netlify.d.ts +27 -2
  105. package/dist/types/deploy/platforms/node.d.ts +6 -5
  106. package/dist/types/deploy/platforms/types.d.ts +7 -0
  107. package/dist/types/deploy/platforms/vercel.d.ts +3 -2
  108. package/dist/types/deploy/redirects.d.ts +7 -2
  109. package/dist/types/deploy/vercel-negotiation.d.ts +3 -2
  110. package/dist/types/openapi/model.d.ts +20 -6
  111. package/dist/types/search/sync/algolia.d.ts +3 -1
  112. package/docs/01-quickstart.mdx +3 -2
  113. package/docs/02-deployment.mdx +17 -8
  114. package/docs/08-faq.mdx +9 -2
  115. package/docs/advanced/changelog.mdx +1 -1
  116. package/docs/advanced/custom-pages.mdx +4 -2
  117. package/docs/cli/audit.mdx +2 -2
  118. package/docs/cli/doctor.mdx +2 -2
  119. package/docs/cli/evals.mdx +2 -2
  120. package/docs/cli/index.mdx +4 -1
  121. package/docs/cli/translate.mdx +1 -1
  122. package/docs/configuration/analytics.mdx +23 -2
  123. package/docs/configuration/assistant.mdx +1 -1
  124. package/docs/configuration/customization.mdx +4 -3
  125. package/docs/configuration/index.mdx +5 -3
  126. package/docs/configuration/search.mdx +1 -1
  127. package/docs/content/components.mdx +1 -1
  128. package/docs/content/frontmatter.mdx +5 -1
  129. package/docs/content/i18n.mdx +1 -1
  130. package/docs/content/index.mdx +4 -2
  131. package/docs/content/meta.mdx +5 -3
  132. package/docs/content/navigation.mdx +29 -4
  133. package/docs/content/sources.mdx +18 -12
  134. package/docs/content/versioning.mdx +1 -0
  135. package/docs/discoverability/agent-discovery.mdx +21 -7
  136. package/docs/discoverability/index.mdx +2 -2
  137. package/docs/discoverability/llms-txt.mdx +2 -5
  138. package/docs/discoverability/markdown.mdx +5 -3
  139. package/docs/discoverability/mcp.mdx +4 -0
  140. package/docs/discoverability/metadata.mdx +3 -2
  141. package/docs/discoverability/open-graph.mdx +6 -4
  142. package/docs/discoverability/rss.mdx +3 -1
  143. package/docs/references/asyncapi.mdx +1 -1
  144. package/docs/references/graphql.mdx +2 -2
  145. package/docs/references/openapi.mdx +3 -3
  146. package/package.json +1 -1
  147. package/skills/blume-migrate/SKILL.md +6 -6
  148. package/skills/blume-migrate/references/docusaurus.md +6 -6
  149. package/skills/blume-migrate/references/mintlify.md +3 -3
  150. package/skills/blume-migrate/references/monorepo.md +1 -1
  151. package/skills/blume-migrate/references/nextra.md +1 -1
  152. package/skills/blume-migrate/references/starlight.md +5 -5
  153. package/skills/blume-migrate/scripts/mintlify-codemod.mjs +2 -2
  154. package/skills/blume-update-docs/references/audit-checklist.md +1 -1
  155. package/src/ai/agent-surface.ts +56 -0
  156. package/src/ai/api/spec.ts +15 -2
  157. package/src/ai/api-catalog.ts +7 -1
  158. package/src/ai/ask-context.ts +14 -2
  159. package/src/ai/ask-data.ts +26 -12
  160. package/src/ai/component-markdown.ts +43 -37
  161. package/src/ai/link-headers.ts +8 -3
  162. package/src/ai/llms.ts +4 -3
  163. package/src/ai/markdown.ts +23 -11
  164. package/src/ai/mcp/server.ts +78 -7
  165. package/src/ai/relative-links.ts +78 -10
  166. package/src/ai/static-expression.ts +416 -0
  167. package/src/ai/visibility.ts +45 -14
  168. package/src/analytics/databuddy.ts +67 -0
  169. package/src/analytics/head.ts +4 -0
  170. package/src/analytics/index.ts +2 -0
  171. package/src/analytics/posthog.ts +21 -3
  172. package/src/analytics/schema.ts +2 -0
  173. package/src/astro/generate.ts +71 -27
  174. package/src/astro/templates.ts +61 -23
  175. package/src/audit/catalog.ts +2 -2
  176. package/src/audit/checks/assets.ts +25 -5
  177. package/src/audit/checks/content.ts +20 -2
  178. package/src/audit/checks/i18n.ts +46 -8
  179. package/src/audit/checks/indexability.ts +39 -19
  180. package/src/audit/checks/links.ts +14 -0
  181. package/src/audit/checks/llms.ts +6 -3
  182. package/src/audit/checks/network.ts +3 -1
  183. package/src/audit/checks/og-image.ts +10 -0
  184. package/src/audit/checks/robots.ts +6 -1
  185. package/src/audit/checks/sitemap.ts +56 -31
  186. package/src/audit/checks/social.ts +21 -2
  187. package/src/audit/crawl.ts +88 -15
  188. package/src/audit/report.ts +54 -17
  189. package/src/audit/run.ts +1 -0
  190. package/src/audit/types.ts +18 -0
  191. package/src/audit/url.ts +37 -6
  192. package/src/cli/build-failure.ts +50 -0
  193. package/src/cli/commands/audit.ts +7 -0
  194. package/src/cli/commands/build.ts +19 -5
  195. package/src/cli/commands/check.ts +2 -0
  196. package/src/cli/commands/eval.ts +1 -7
  197. package/src/cli/commands/init.ts +15 -5
  198. package/src/cli/commands/preview.ts +15 -0
  199. package/src/cli/commands/sync.ts +2 -0
  200. package/src/cli/commands/translate.ts +9 -6
  201. package/src/cli/commands/upgrade.ts +11 -0
  202. package/src/cli/eject-scripts.ts +32 -7
  203. package/src/cli/env.ts +12 -1
  204. package/src/cli/init/scaffold.ts +117 -11
  205. package/src/cli/init/starter-spec.ts +235 -0
  206. package/src/components/content/AccordionItem.astro +26 -22
  207. package/src/components/content/Badge.astro +2 -9
  208. package/src/components/content/Card.astro +2 -2
  209. package/src/components/content/Component.astro +9 -3
  210. package/src/components/content/Expandable.astro +5 -1
  211. package/src/components/content/Frame.astro +2 -7
  212. package/src/components/content/GithubInfo.astro +12 -2
  213. package/src/components/content/Prompt.astro +2 -7
  214. package/src/components/content/Tabs.astro +54 -5
  215. package/src/components/content/Tile.astro +1 -1
  216. package/src/components/content/Tooltip.astro +69 -7
  217. package/src/components/content/Tree.astro +7 -2
  218. package/src/components/content/TypeTable.astro +10 -5
  219. package/src/components/content/Update.astro +8 -2
  220. package/src/components/content/auto-type-table.ts +4 -1
  221. package/src/components/content/badge-color.ts +17 -0
  222. package/src/components/content/base-href.ts +18 -3
  223. package/src/components/content/inline-markdown.ts +27 -7
  224. package/src/components/copy-feedback.ts +35 -8
  225. package/src/components/islands/assistant.tsx +16 -2
  226. package/src/components/islands/hooks.ts +7 -2
  227. package/src/components/islands/webmcp.ts +12 -8
  228. package/src/components/layout/Banner.astro +23 -4
  229. package/src/components/layout/Header.astro +22 -9
  230. package/src/components/layout/Logo.astro +5 -0
  231. package/src/components/layout/NavSelector.astro +6 -1
  232. package/src/components/layout/NavTabMenu.astro +133 -0
  233. package/src/components/layout/NavTree.astro +15 -6
  234. package/src/components/layout/NavTreeCache.astro +5 -2
  235. package/src/components/layout/NavTreeScript.astro +45 -5
  236. package/src/components/layout/PageLayout.astro +22 -8
  237. package/src/components/layout/ReferenceLayout.astro +4 -1
  238. package/src/components/layout/RootLayout.astro +21 -8
  239. package/src/components/layout/Search.astro +5 -1
  240. package/src/components/layout/analytics-client.ts +2 -0
  241. package/src/components/openapi/GraphqlType.astro +11 -3
  242. package/src/components/openapi/MessageComposer.astro +1 -1
  243. package/src/components/openapi/Operation.astro +21 -5
  244. package/src/components/openapi/PanelTabs.astro +4 -1
  245. package/src/components/openapi/Playground.astro +8 -2
  246. package/src/components/openapi/RequestPanel.astro +9 -5
  247. package/src/components/openapi/SchemaProperty.astro +11 -33
  248. package/src/components/openapi/SchemaTable.astro +27 -52
  249. package/src/components/openapi/helpers.ts +90 -12
  250. package/src/components/openapi/message-composer.ts +8 -0
  251. package/src/components/openapi/message-model.ts +12 -2
  252. package/src/components/openapi/message.ts +4 -1
  253. package/src/components/openapi/operation-model.ts +40 -8
  254. package/src/components/openapi/panel.ts +29 -5
  255. package/src/components/openapi/playground-client.ts +37 -7
  256. package/src/components/openapi/playground-schema.ts +25 -6
  257. package/src/components/openapi/request.ts +2 -0
  258. package/src/components/openapi/schema-tree.ts +203 -0
  259. package/src/components/openapi/snippets.ts +30 -15
  260. package/src/components/openapi/validate-json.ts +1 -1
  261. package/src/core/base-path.ts +15 -0
  262. package/src/core/config-input.ts +4 -4
  263. package/src/core/config.ts +18 -4
  264. package/src/core/diagnostics.ts +217 -30
  265. package/src/core/graph.ts +120 -11
  266. package/src/core/i18n-ui.ts +39 -2
  267. package/src/core/i18n.ts +13 -2
  268. package/src/core/links.ts +7 -4
  269. package/src/core/load-module.ts +20 -0
  270. package/src/core/locale-links.ts +17 -17
  271. package/src/core/manifest.ts +3 -2
  272. package/src/core/meta.ts +69 -6
  273. package/src/core/nav-diagnostics.ts +56 -1
  274. package/src/core/navigation.ts +245 -76
  275. package/src/core/ordering-prefix.ts +27 -0
  276. package/src/core/project-graph.ts +23 -1
  277. package/src/core/safe-href.ts +53 -1
  278. package/src/core/safe-links.ts +11 -2
  279. package/src/core/schema.ts +70 -14
  280. package/src/core/sources/assets.ts +83 -41
  281. package/src/core/sources/contentful-rich-text.ts +3 -2
  282. package/src/core/sources/contentful.ts +25 -12
  283. package/src/core/sources/filesystem.ts +5 -1
  284. package/src/core/sources/github-releases.ts +106 -5
  285. package/src/core/sources/lexical.ts +9 -4
  286. package/src/core/sources/lower.ts +79 -26
  287. package/src/core/sources/mdx-remote.ts +1 -0
  288. package/src/core/sources/normalize.ts +132 -30
  289. package/src/core/sources/notion.ts +26 -10
  290. package/src/core/sources/obsidian.ts +17 -3
  291. package/src/core/sources/payload.ts +1 -0
  292. package/src/core/sources/portable-text.ts +63 -44
  293. package/src/core/sources/remote.ts +18 -2
  294. package/src/core/sources/resolve.ts +52 -33
  295. package/src/core/sources/sanity.ts +1 -0
  296. package/src/core/sources/strapi-blocks.ts +9 -4
  297. package/src/core/sources/strapi.ts +1 -0
  298. package/src/core/sources/types.ts +31 -0
  299. package/src/core/types.ts +9 -0
  300. package/src/core/ui-packs/ar.ts +13 -0
  301. package/src/core/ui-packs/bg.ts +13 -0
  302. package/src/core/ui-packs/bn.ts +13 -0
  303. package/src/core/ui-packs/ca.ts +13 -0
  304. package/src/core/ui-packs/cs.ts +13 -0
  305. package/src/core/ui-packs/da.ts +13 -0
  306. package/src/core/ui-packs/de.ts +13 -0
  307. package/src/core/ui-packs/el.ts +13 -0
  308. package/src/core/ui-packs/es.ts +13 -0
  309. package/src/core/ui-packs/fa.ts +13 -0
  310. package/src/core/ui-packs/fi.ts +13 -0
  311. package/src/core/ui-packs/fr.ts +13 -0
  312. package/src/core/ui-packs/he.ts +13 -0
  313. package/src/core/ui-packs/hi.ts +13 -0
  314. package/src/core/ui-packs/hr.ts +13 -0
  315. package/src/core/ui-packs/hu.ts +13 -0
  316. package/src/core/ui-packs/id.ts +13 -0
  317. package/src/core/ui-packs/it.ts +13 -0
  318. package/src/core/ui-packs/ja.ts +13 -0
  319. package/src/core/ui-packs/ko.ts +13 -0
  320. package/src/core/ui-packs/nl.ts +13 -0
  321. package/src/core/ui-packs/no.ts +13 -0
  322. package/src/core/ui-packs/pl.ts +13 -0
  323. package/src/core/ui-packs/pt-br.ts +13 -0
  324. package/src/core/ui-packs/pt.ts +13 -0
  325. package/src/core/ui-packs/ro.ts +13 -0
  326. package/src/core/ui-packs/ru.ts +13 -0
  327. package/src/core/ui-packs/sk.ts +13 -0
  328. package/src/core/ui-packs/sr.ts +13 -0
  329. package/src/core/ui-packs/sv.ts +13 -0
  330. package/src/core/ui-packs/th.ts +13 -0
  331. package/src/core/ui-packs/tr.ts +13 -0
  332. package/src/core/ui-packs/uk.ts +13 -0
  333. package/src/core/ui-packs/vi.ts +13 -0
  334. package/src/core/ui-packs/zh-tw.ts +13 -0
  335. package/src/core/ui-packs/zh.ts +13 -0
  336. package/src/core/version-cut.ts +17 -2
  337. package/src/core/versions.ts +4 -1
  338. package/src/deploy/adapters/node.ts +5 -2
  339. package/src/deploy/adapters/registry.ts +2 -1
  340. package/src/deploy/adapters/types.ts +13 -1
  341. package/src/deploy/artifacts.ts +25 -5
  342. package/src/deploy/cloudflare-negotiation.ts +23 -4
  343. package/src/deploy/headers.ts +67 -51
  344. package/src/deploy/node-headers.ts +148 -27
  345. package/src/deploy/platforms/cloudflare.ts +1 -0
  346. package/src/deploy/platforms/netlify.ts +82 -5
  347. package/src/deploy/platforms/node.ts +7 -5
  348. package/src/deploy/platforms/static.ts +1 -0
  349. package/src/deploy/platforms/types.ts +7 -0
  350. package/src/deploy/platforms/vercel.ts +9 -3
  351. package/src/deploy/redirects.ts +14 -3
  352. package/src/deploy/vercel-negotiation.ts +35 -3
  353. package/src/eval/agents.ts +10 -2
  354. package/src/eval/run.ts +25 -0
  355. package/src/markdown/base-links.ts +55 -8
  356. package/src/markdown/index.ts +6 -3
  357. package/src/markdown/relative-links.ts +3 -23
  358. package/src/markdown/route-snapshot.ts +37 -0
  359. package/src/og/card.ts +20 -4
  360. package/src/og/derive.ts +145 -4
  361. package/src/openapi/graphql-build.ts +28 -2
  362. package/src/openapi/model.ts +77 -13
  363. package/src/openapi/render-mdx.ts +10 -1
  364. package/src/registry/eject.ts +119 -22
  365. package/src/search/documents.ts +22 -1
  366. package/src/search/sync/algolia.ts +36 -2
  367. package/src/sources/registry.ts +5 -0
  368. package/src/theme/entry.ts +11 -4
  369. package/src/translate/agents.ts +6 -1
  370. package/src/translate/ledger.ts +26 -3
  371. package/src/translate/meta.ts +11 -3
  372. package/src/translate/run.ts +11 -5
  373. package/src/translate/validate.ts +10 -1
  374. package/src/translate/work-list.ts +36 -3
  375. package/src/upgrade/upgrade.ts +36 -4
  376. package/dist/cli/chunk-2hn4b8z7.js.map +0 -12
  377. package/dist/cli/chunk-6crbhc3x.js.map +0 -14
  378. package/dist/cli/chunk-6hsn950k.js.map +0 -10
  379. package/dist/cli/chunk-79jhk4py.js.map +0 -35
  380. package/dist/cli/chunk-82bbrxdn.js +0 -51
  381. package/dist/cli/chunk-82bbrxdn.js.map +0 -10
  382. package/dist/cli/chunk-abh8yjkn.js +0 -31
  383. package/dist/cli/chunk-abh8yjkn.js.map +0 -10
  384. package/dist/cli/chunk-dh8cwk36.js.map +0 -10
  385. package/dist/cli/chunk-epjnccmv.js.map +0 -10
  386. package/dist/cli/chunk-fa25z98p.js.map +0 -11
  387. package/dist/cli/chunk-fs23ddbb.js.map +0 -35
  388. package/dist/cli/chunk-fz5wtpmh.js.map +0 -10
  389. package/dist/cli/chunk-kpf8rrjc.js.map +0 -19
  390. package/dist/cli/chunk-m3vmjgmq.js.map +0 -10
  391. package/dist/cli/chunk-mb2919y2.js.map +0 -10
  392. package/dist/cli/chunk-q5163e60.js.map +0 -11
  393. package/dist/cli/chunk-qkqwkpte.js.map +0 -182
  394. package/dist/cli/chunk-qs4q5p4e.js.map +0 -10
  395. package/dist/cli/chunk-s1p84fyh.js.map +0 -10
  396. package/dist/cli/chunk-wgm7m9qk.js.map +0 -36
  397. package/dist/cli/chunk-yt5n7ppj.js.map +0 -10
  398. /package/dist/cli/{chunk-vtk4a6dg.js.map → chunk-00gs3wqs.js.map} +0 -0
  399. /package/dist/cli/{chunk-6vm74dry.js.map → chunk-6dtt0zfn.js.map} +0 -0
  400. /package/dist/cli/{chunk-fxypxtvm.js.map → chunk-bbnwccaz.js.map} +0 -0
  401. /package/dist/cli/{chunk-ce574jw2.js.map → chunk-esh98wmb.js.map} +0 -0
  402. /package/dist/cli/{chunk-zxcczpyx.js.map → chunk-fsmrqk8a.js.map} +0 -0
  403. /package/dist/cli/{chunk-hdpx1tax.js.map → chunk-g698a744.js.map} +0 -0
  404. /package/dist/cli/{chunk-zxh4d9vy.js.map → chunk-h2ez8dzb.js.map} +0 -0
  405. /package/dist/cli/{chunk-5shv93fd.js.map → chunk-h7k3nq3v.js.map} +0 -0
  406. /package/dist/cli/{chunk-ah61y8py.js.map → chunk-mqc662a6.js.map} +0 -0
  407. /package/dist/cli/{chunk-ch6g3ar0.js.map → chunk-n1yg3tj3.js.map} +0 -0
  408. /package/dist/cli/{chunk-wm7js3j9.js.map → chunk-sqw4ekg1.js.map} +0 -0
  409. /package/dist/cli/{chunk-27g6wdth.js.map → chunk-wdrt2k2v.js.map} +0 -0
  410. /package/dist/cli/{chunk-s6jhgk0q.js.map → chunk-zp79m0ts.js.map} +0 -0
@@ -0,0 +1,43 @@
1
+ import { z } from "zod";
2
+ import type { AdapterDescriptor } from "../core/adapter.ts";
3
+ import type { HeadScript } from "./head.ts";
4
+ /** The script Databuddy's install snippet loads. */
5
+ export declare const DATABUDDY_SCRIPT_SRC = "https://cdn.databuddy.cc/databuddy.js";
6
+ /** The options {@link databuddy} maps itself. */
7
+ export interface DatabuddyNamedOptions {
8
+ /** Client ID, from the website's settings in the Databuddy dashboard. */
9
+ clientId: string;
10
+ }
11
+ /**
12
+ * Options for {@link databuddy}: the client ID plus any other tracker setting,
13
+ * forwarded as a `data-` attribute on the tag (`"track-web-vitals"` →
14
+ * `data-track-web-vitals`, `"track-errors"`, `"track-outgoing-links"`,
15
+ * `"api-url"`, …).
16
+ */
17
+ export type DatabuddyOptions = DatabuddyNamedOptions & {
18
+ [setting: string]: string;
19
+ };
20
+ export declare const databuddyOptionsSchema: z.ZodObject<{
21
+ clientId: z.ZodString;
22
+ }, z.core.$catchall<z.ZodString>>;
23
+ export type DatabuddyAdapter = AdapterDescriptor<"databuddy", DatabuddyOptions>;
24
+ export declare const databuddyAdapterSchema: z.ZodObject<{
25
+ kind: z.ZodLiteral<"databuddy">;
26
+ options: z.ZodObject<{
27
+ clientId: z.ZodString;
28
+ }, z.core.$catchall<z.ZodString>>;
29
+ requiredSecrets: z.ZodArray<z.ZodString>;
30
+ runtimeDeps: z.ZodArray<z.ZodString>;
31
+ }, z.core.$strict>;
32
+ /**
33
+ * Databuddy. The client ID is public — it's in the tag on every page.
34
+ */
35
+ export declare const databuddy: (options: DatabuddyOptions) => DatabuddyAdapter;
36
+ /**
37
+ * The async tag from the install instructions, with `clientId` as
38
+ * `data-client-id` and every other option as its own `data-` attribute. The
39
+ * tracker skips setup when `window.databuddy` already exists, so there is no
40
+ * queue stub. Databuddy's script tracks history changes on its own, so
41
+ * client-router navigations need no extra hook.
42
+ */
43
+ export declare const databuddyHead: (options: DatabuddyOptions) => HeadScript[];
@@ -30,6 +30,8 @@ export { clearbit } from "./clearbit.ts";
30
30
  export type { ClearbitAdapter, ClearbitOptions } from "./clearbit.ts";
31
31
  export { cloudflare } from "./cloudflare.ts";
32
32
  export type { CloudflareAdapter, CloudflareOptions } from "./cloudflare.ts";
33
+ export { databuddy } from "./databuddy.ts";
34
+ export type { DatabuddyAdapter, DatabuddyOptions } from "./databuddy.ts";
33
35
  export { fathom } from "./fathom.ts";
34
36
  export type { FathomAdapter, FathomOptions } from "./fathom.ts";
35
37
  export { googleAnalytics } from "./google-analytics.ts";
@@ -35,6 +35,13 @@ export declare const analyticsAdapterSchema: z.ZodDiscriminatedUnion<[z.ZodObjec
35
35
  }, z.core.$catchall<z.ZodJSONSchema>>;
36
36
  requiredSecrets: z.ZodArray<z.ZodString>;
37
37
  runtimeDeps: z.ZodArray<z.ZodString>;
38
+ }, z.core.$strict>, z.ZodObject<{
39
+ kind: z.ZodLiteral<"databuddy">;
40
+ options: z.ZodObject<{
41
+ clientId: z.ZodString;
42
+ }, z.core.$catchall<z.ZodString>>;
43
+ requiredSecrets: z.ZodArray<z.ZodString>;
44
+ runtimeDeps: z.ZodArray<z.ZodString>;
38
45
  }, z.core.$strict>, z.ZodObject<{
39
46
  kind: z.ZodLiteral<"fathom">;
40
47
  options: z.ZodObject<{
@@ -197,6 +204,13 @@ export declare const analyticsConfigSchema: z.ZodDefault<z.ZodArray<z.ZodDiscrim
197
204
  }, z.core.$catchall<z.ZodJSONSchema>>;
198
205
  requiredSecrets: z.ZodArray<z.ZodString>;
199
206
  runtimeDeps: z.ZodArray<z.ZodString>;
207
+ }, z.core.$strict>, z.ZodObject<{
208
+ kind: z.ZodLiteral<"databuddy">;
209
+ options: z.ZodObject<{
210
+ clientId: z.ZodString;
211
+ }, z.core.$catchall<z.ZodString>>;
212
+ requiredSecrets: z.ZodArray<z.ZodString>;
213
+ runtimeDeps: z.ZodArray<z.ZodString>;
200
214
  }, z.core.$strict>, z.ZodObject<{
201
215
  kind: z.ZodLiteral<"fathom">;
202
216
  options: z.ZodObject<{
@@ -8,5 +8,10 @@
8
8
  * these files at build time, so a value means the same thing to the pre-boot
9
9
  * content scan and the built site — including multi-line double-quoted values
10
10
  * (PEM keys), which a line-based parser silently truncates.
11
+ *
12
+ * `NODE_ENV` is never taken from these files: it picks the mode Vite and Astro
13
+ * run in, so a monorepo root `.env` that sets it for another app would turn
14
+ * every `blume build` into a development build (or `blume dev` into a
15
+ * production one).
11
16
  */
12
17
  export declare const loadEnvFiles: (startDir: string) => void;
@@ -33,6 +33,10 @@ export declare const STARTERS: {
33
33
  content: string;
34
34
  path: string;
35
35
  }[];
36
+ projectFiles: {
37
+ content: string;
38
+ path: string;
39
+ }[];
36
40
  };
37
41
  changelog: {
38
42
  configExtra: string;
@@ -71,6 +75,11 @@ export declare const commandsFor: (pm: PackageManager) => {
71
75
  exec: string;
72
76
  install: string;
73
77
  };
78
+ /**
79
+ * The `cd` into the new project, quoting a directory a shell would split or
80
+ * expand: `blume init "my docs"` prints `cd "my docs"`, not `cd my docs`.
81
+ */
82
+ export declare const cdCommand: (directory: string) => string;
74
83
  /**
75
84
  * Derive the package manager from an npm user-agent string (the first
76
85
  * `name/version` token of `npm_config_user_agent`), falling back to npm.
@@ -97,6 +106,12 @@ export declare const validateContentDir: (root: string, dir: string) => string |
97
106
  export declare const titleize: (raw: string) => string;
98
107
  /** The full `blume.config.ts` text for the chosen answers. */
99
108
  export declare const buildConfig: (answers: InitAnswers) => string;
109
+ /**
110
+ * Whether `init` installs with pnpm into a folder that sits inside a pnpm
111
+ * workspace without being one of its packages. pnpm would install that
112
+ * workspace's own packages from there and exit 0, leaving `blume` uninstalled.
113
+ */
114
+ export declare const outsidePnpmWorkspace: (root: string, answers: InitAnswers) => boolean;
100
115
  /**
101
116
  * The major version of the Yarn that ran `init`, read off the npm user agent
102
117
  * (`yarn/4.5.1 npm/? node/v22…`), or undefined when something else ran it.
@@ -108,9 +123,10 @@ export interface PlanEnvironment {
108
123
  userAgent?: string;
109
124
  }
110
125
  /**
111
- * What the project still needs from a workspace it joins, when `init` left
112
- * that workspace's config alone: pnpm's approval for esbuild's build script
113
- * (pnpm 10 and later fail the install without it), or Yarn Berry's
126
+ * What the project still needs from a workspace it sits in, when `init` left
127
+ * that workspace's config alone: a place in a pnpm workspace's `packages`
128
+ * (pnpm skips a folder it doesn't list), pnpm's approval for esbuild's build
129
+ * script (pnpm 10 and later fail the install without it), or Yarn Berry's
114
130
  * `node_modules` linker. Undefined when the workspace already has it, or the
115
131
  * project doesn't sit in one.
116
132
  */
@@ -0,0 +1,11 @@
1
+ /**
2
+ * The OpenAPI document the `api` starter writes beside `blume.config.ts`, so a
3
+ * new project's first build reads a local file instead of depending on a
4
+ * third-party server. Small, but it exercises what a real reference renders:
5
+ * path and query parameters, request bodies, shared schemas, error responses,
6
+ * and bearer auth. Each operation's description is sized so its page's meta
7
+ * description, with the endpoint sentence Blume appends, fits the range
8
+ * `blume audit` checks.
9
+ */
10
+ /** The starter spec as the `openapi.json` text `init` writes. */
11
+ export declare const STARTER_OPENAPI_JSON: string;
@@ -51,6 +51,15 @@ export declare const isExternalUrl: (target: string) => boolean;
51
51
  * the base by hand (`/docs/x`) aren't double-prefixed to `/docs/docs/x`.
52
52
  */
53
53
  export declare const withBasePath: (basePath: string, route: string) => string;
54
+ /**
55
+ * Mount a route Blume generates from content under `basePath`,
56
+ * unconditionally. {@link withBasePath} leaves a route that already starts
57
+ * with the base alone, which is right for a link an author based by hand but
58
+ * wrong for a content route: with `basePath: "/docs"`, `docs/guide.md` routes
59
+ * to `/docs/guide` before the base and publishes at `/docs/docs/guide`, not on
60
+ * top of the root `guide.md`.
61
+ */
62
+ export declare const mountBasePath: (basePath: string, route: string) => string;
54
63
  /**
55
64
  * {@link withBasePath} for the composed `deployment.base` + `basePath` stack
56
65
  * (`/base` + `/docs` serves pages at `/base/docs/x`). The hand-written-base
@@ -524,14 +524,14 @@ export interface LlmsTxtConfig {
524
524
  /**
525
525
  * Markdown placed after the title and summary in `llms.txt`, before the
526
526
  * page sections — the llms.txt spec's "details" block. Use it to tell
527
- * agents when to reach for the product and how to call it (a "When to use"
528
- * heading, the install command, the package name). Blank values are
529
- * dropped.
527
+ * agents when to reach for the product and how to call it (the install
528
+ * command, the package name). The spec allows any Markdown there but
529
+ * headings. Blank values are dropped.
530
530
  *
531
531
  * ```ts
532
532
  * agents: {
533
533
  * llmsTxt: {
534
- * details: "## When to use Acme\n\nUse Acme when…",
534
+ * details: "Use Acme when…",
535
535
  * },
536
536
  * }
537
537
  * ```
@@ -55,8 +55,8 @@ import type { Diagnostic } from "./types.ts";
55
55
  * - `theme` — `accent` color, `fonts` (curated slugs, any provider family, or
56
56
  * local font files), `radius`,
57
57
  * `mode` (`system`/`light`/`dark`), and `background`.
58
- * - `markdown` — `code` (language icons, inline highlighting, line wrap),
59
- * `headingAnchors`, `imageZoom`, and opt-in KaTeX `math`.
58
+ * - `markdown` — `code` (language icons, light/dark Shiki `theme`, line
59
+ * `wrap`), `externalLinks`, `headingAnchors`, and `imageZoom`.
60
60
  * - `toc` — on-page table of contents; `true`/`false` or a heading-level range.
61
61
  * - `lastModified` — "Last updated" stamps from `git` history or frontmatter.
62
62
  * - `feedback` — the per-page "Was this helpful?" widget (on by default).
@@ -1,6 +1,8 @@
1
1
  import type { FolderMeta, ResolvedConfig, ResolvedI18nConfig, ResolvedVersionsConfig } from "./schema.ts";
2
2
  import type { ContentGraph, PageRecord } from "./types.ts";
3
3
  interface BuildContentGraphOptions {
4
+ /** The banner's link target as configured (`banner.link.href`), if any. */
5
+ bannerHref?: string;
4
6
  /** Site-wide route mount point (`""` or `/seg`); invisible to the nav tree. */
5
7
  basePath?: string;
6
8
  /** The header brand link as configured (`logo.href`, default `/`). */
@@ -51,9 +51,20 @@ declare const uiStringsObject: z.ZodObject<{
51
51
  title: z.ZodDefault<z.ZodString>;
52
52
  }, z.core.$strip>>;
53
53
  content: z.ZodPrefault<z.ZodObject<{
54
+ code: z.ZodDefault<z.ZodString>;
54
55
  copyColor: z.ZodDefault<z.ZodString>;
55
56
  copyPrompt: z.ZodDefault<z.ZodString>;
57
+ default: z.ZodDefault<z.ZodString>;
56
58
  diagramError: z.ZodDefault<z.ZodString>;
59
+ forks: z.ZodDefault<z.ZodString>;
60
+ preview: z.ZodDefault<z.ZodString>;
61
+ prop: z.ZodDefault<z.ZodString>;
62
+ selectTab: z.ZodDefault<z.ZodString>;
63
+ showMore: z.ZodDefault<z.ZodString>;
64
+ stars: z.ZodDefault<z.ZodString>;
65
+ tab: z.ZodDefault<z.ZodString>;
66
+ type: z.ZodDefault<z.ZodString>;
67
+ update: z.ZodDefault<z.ZodString>;
57
68
  }, z.core.$strip>>;
58
69
  feedback: z.ZodPrefault<z.ZodObject<{
59
70
  no: z.ZodDefault<z.ZodString>;
@@ -103,8 +114,10 @@ declare const uiStringsObject: z.ZodObject<{
103
114
  assistantHint: z.ZodDefault<z.ZodString>;
104
115
  button: z.ZodDefault<z.ZodString>;
105
116
  devOnly: z.ZodDefault<z.ZodString>;
117
+ docs: z.ZodDefault<z.ZodString>;
106
118
  error: z.ZodDefault<z.ZodString>;
107
119
  label: z.ZodDefault<z.ZodString>;
120
+ latest: z.ZodDefault<z.ZodString>;
108
121
  navigate: z.ZodDefault<z.ZodString>;
109
122
  noResults: z.ZodDefault<z.ZodString>;
110
123
  open: z.ZodDefault<z.ZodString>;
@@ -166,9 +179,20 @@ export declare const uiStringsSchema: z.ZodPrefault<z.ZodObject<{
166
179
  title: z.ZodDefault<z.ZodString>;
167
180
  }, z.core.$strip>>;
168
181
  content: z.ZodPrefault<z.ZodObject<{
182
+ code: z.ZodDefault<z.ZodString>;
169
183
  copyColor: z.ZodDefault<z.ZodString>;
170
184
  copyPrompt: z.ZodDefault<z.ZodString>;
185
+ default: z.ZodDefault<z.ZodString>;
171
186
  diagramError: z.ZodDefault<z.ZodString>;
187
+ forks: z.ZodDefault<z.ZodString>;
188
+ preview: z.ZodDefault<z.ZodString>;
189
+ prop: z.ZodDefault<z.ZodString>;
190
+ selectTab: z.ZodDefault<z.ZodString>;
191
+ showMore: z.ZodDefault<z.ZodString>;
192
+ stars: z.ZodDefault<z.ZodString>;
193
+ tab: z.ZodDefault<z.ZodString>;
194
+ type: z.ZodDefault<z.ZodString>;
195
+ update: z.ZodDefault<z.ZodString>;
172
196
  }, z.core.$strip>>;
173
197
  feedback: z.ZodPrefault<z.ZodObject<{
174
198
  no: z.ZodDefault<z.ZodString>;
@@ -218,8 +242,10 @@ export declare const uiStringsSchema: z.ZodPrefault<z.ZodObject<{
218
242
  assistantHint: z.ZodDefault<z.ZodString>;
219
243
  button: z.ZodDefault<z.ZodString>;
220
244
  devOnly: z.ZodDefault<z.ZodString>;
245
+ docs: z.ZodDefault<z.ZodString>;
221
246
  error: z.ZodDefault<z.ZodString>;
222
247
  label: z.ZodDefault<z.ZodString>;
248
+ latest: z.ZodDefault<z.ZodString>;
223
249
  navigate: z.ZodDefault<z.ZodString>;
224
250
  noResults: z.ZodDefault<z.ZodString>;
225
251
  open: z.ZodDefault<z.ZodString>;
@@ -268,6 +294,11 @@ export { UI_PACKS } from "./ui-packs/index.ts";
268
294
  * English baseline ← default-locale pack ← default-locale override ←
269
295
  * locale pack ← locale override. So a missing key falls back to the default
270
296
  * locale's translation, then to English.
297
+ *
298
+ * English has no pack because the baseline is its complete translation, so an
299
+ * English locale (`en`, `en-GB`) skips the default-locale layers: on a site
300
+ * whose default is German, English pages keep English chrome instead of
301
+ * inheriting the German strings.
271
302
  */
272
303
  export declare const resolveUIStrings: (locale: string, options: {
273
304
  defaultLocale: string;
@@ -76,8 +76,14 @@ export declare const localePlacement: (rel: string, ext: string, i18n: ResolvedI
76
76
  * (`x.en.mdx`) swaps it for the target's (`x.fr.mdx`) — same case-insensitive
77
77
  * last-dot-inside-filename logic as `localePlacement`, so both spellings of a
78
78
  * default-locale file resolve to one canonical target.
79
+ *
80
+ * Under `dir`, `folders` are the content root's existing top-level folders: one
81
+ * that names the locale in another casing (`pt-br/` for a configured `pt-BR`)
82
+ * is the locale's folder already, since {@link detectLocale} matches it case-
83
+ * insensitively. Writing beside it into a second `pt-BR/` would, on a case-
84
+ * sensitive filesystem, publish the page twice.
79
85
  */
80
- export declare const localeTargetPath: (rel: string, ext: string, locale: string, i18n: ResolvedI18nConfig) => string;
86
+ export declare const localeTargetPath: (rel: string, ext: string, locale: string, i18n: ResolvedI18nConfig, folders?: readonly string[]) => string;
81
87
  /**
82
88
  * Warn about top-level content folders that look like a locale (a code Blume
83
89
  * recognizes) but aren't declared in `i18n.locales`. Without this they're
@@ -35,7 +35,9 @@ export declare const resolveRelativeHref: (href: string, from: RelativeLinkBase,
35
35
  * Whether a content file is its folder's index, from its name as written on
36
36
  * disk: `index.md(x)` after an ordering prefix, optionally carrying one of
37
37
  * `localeTokens` before the extension (`index.fr.mdx` under the `dot` locale
38
- * parser, `index.$.mdx` for a file shared by every locale).
38
+ * parser, `index.$.mdx` for a file shared by every locale). The `index` itself
39
+ * is case-sensitive, as route mapping reads it: `Index.md` is a page named
40
+ * `Index`, not its folder's index.
39
41
  */
40
42
  export declare const isIndexFileName: (name: string, localeTokens?: readonly string[]) => boolean;
41
43
  /** Where content files publish, for resolving file links (`./setup.mdx`). */
@@ -5,3 +5,13 @@
5
5
  * which is what makes dev-server regeneration reflect config/meta changes.
6
6
  */
7
7
  export declare const createModuleLoader: () => ((file: string) => Promise<unknown>);
8
+ /**
9
+ * Create a loader for a module whose default export is its whole value
10
+ * (`blume.config.ts`). Unlike {@link createModuleLoader}, it never falls back
11
+ * to the module's namespace: a module with no default export, or one that
12
+ * exports `null`/`undefined`, resolves to `undefined` so the caller can say
13
+ * so, instead of validating `{}` (a bare `defineConfig({…})` call) or
14
+ * `{ config }` (a named export). jiti's default interop is off because it
15
+ * throws on `export default null`.
16
+ */
17
+ export declare const createDefaultExportLoader: typeof createModuleLoader;
@@ -33,6 +33,11 @@ export interface LocalizeLinkOptions {
33
33
  /** Every served route, base-prefixed like `path` (no `deployment.base`). */
34
34
  routes: RouteSet;
35
35
  }
36
+ /**
37
+ * Whether `routes` serves `route` (base-prefixed, fragment-less). Routes are
38
+ * stored decoded, so a browser-copied `/caf%C3%A9` still finds its page.
39
+ */
40
+ export declare const servesRoute: (routes: RouteSet, route: string) => boolean;
36
41
  /**
37
42
  * Move a base-prefixed, fragment-less internal path into `locale` when that
38
43
  * route is served, else return it unchanged. Idempotent: a path already under
@@ -44,9 +49,14 @@ export interface LocalizeHrefOptions extends LocalizeLinkOptions {
44
49
  deployBase: string;
45
50
  }
46
51
  /**
47
- * Localize a rendered `href`: external URLs, relative paths, bare fragments, and
48
- * asset links pass through; a root-relative page link keeps its `?query` and
52
+ * Localize a rendered `href`: external URLs, relative paths, and bare
53
+ * fragments pass through; a root-relative page link keeps its `?query` and
49
54
  * `#fragment` and its `deployment.base` layer around the localized path.
55
+ *
56
+ * Asset links (`/logo.png`, a raw `.md` twin) pass through too, because no
57
+ * page is served at their localized path — the same served-route test the
58
+ * link checker applies. A file extension alone doesn't mark an asset: a
59
+ * dotted page route (`/releases/v1.2`) is localized like any other page.
50
60
  */
51
61
  export declare const localizeHref: (href: string, options: LocalizeHrefOptions) => string;
52
62
  /**
@@ -2,10 +2,14 @@ import type { FolderMeta } from "./schema.ts";
2
2
  import type { Diagnostic } from "./types.ts";
3
3
  /** A filesystem content source to scan for folder meta: its on-disk root and
4
4
  * optional route prefix. The prefix is folded into every key so meta lines up
5
- * with the sidebar group path, which carries the same prefix. */
5
+ * with the sidebar group path, which carries the same prefix. `include` and
6
+ * `exclude` are the source's content globs, which scope the scan to the
7
+ * folders the source reads. */
6
8
  export interface FolderMetaSource {
7
9
  root: string;
8
10
  prefix?: string;
11
+ include?: readonly string[];
12
+ exclude?: readonly string[];
9
13
  }
10
14
  /**
11
15
  * Discover `meta.{ts,js,mjs}` files across the given filesystem sources. Keys are
@@ -1,3 +1,4 @@
1
+ import type { SidebarItemConfig } from "./schema.ts";
1
2
  import type { Diagnostic, Navigation, PageRecord } from "./types.ts";
2
3
  /** Warn about icon names that aren't in Blume's set (skipping image/SVG icons). */
3
4
  export declare const validateNavIcons: (navigation: Navigation) => Diagnostic[];
@@ -16,6 +17,15 @@ export declare const validateSearchPopularIcons: (popular: {
16
17
  * not in the content-only graph build.
17
18
  */
18
19
  export declare const validateNavTargets: (navigation: Navigation, routes: Set<string>) => Diagnostic[];
20
+ /**
21
+ * Warn about explicit `navigation.sidebar` items that can't render as written,
22
+ * instead of dropping them without a word: a page ref that matches no page
23
+ * (left out of the sidebar), a `root` that matches no page (its link leads
24
+ * nowhere), and an item with no page, `href`, `root`, or `items` (left out).
25
+ * `resolves` answers whether a normalized ref (`/guides`) names a page — in
26
+ * any locale — or a route served outside the content tree.
27
+ */
28
+ export declare const validateSidebarItems: (items: SidebarItemConfig[], resolves: (route: string) => boolean) => Diagnostic[];
19
29
  /**
20
30
  * Structural navigation diagnostics that need only the built navigation +
21
31
  * content pages: duplicate sidebar labels at a level, and hidden pages that
@@ -18,6 +18,29 @@ export declare const isUnderPath: (route: string, base: string) => boolean;
18
18
  * sidebar or highlight the wrong tab over it.
19
19
  */
20
20
  export declare const isRootTab: (tab: NavTab, root: string) => boolean;
21
+ /**
22
+ * Capitalize one word of a slug-like name for display, spelling the acronyms
23
+ * and brand casings in {@link WORD_FORMS} their own way (`api` → "API").
24
+ * Shared with page titles derived from file names, so a page and a folder
25
+ * named alike read alike.
26
+ */
27
+ export declare const titleWord: (word: string) => string;
28
+ /**
29
+ * An explicit-sidebar ref (`"guides/"`, `"/guides/index"`, `"index"`) in the
30
+ * slashless route form pages are keyed by (`/guides`, `/`).
31
+ */
32
+ export declare const normalizeRef: (ref: string) => string;
33
+ /** An explicit-config sidebar item written as a bare page-ref string. */
34
+ export declare const isPageRef: (item: SidebarItemConfig) => item is string;
35
+ /**
36
+ * Pages keyed the way explicit-sidebar refs look them up: by the
37
+ * locale-agnostic `translationKey` under i18n (`byLogical`), so one authored
38
+ * sidebar maps onto every locale's pages, else by route. Refs are authored as
39
+ * if mounted at root while `page.route` carries the base, so each page is also
40
+ * aliased under its base-less route (the `translationKey` is base-less
41
+ * already).
42
+ */
43
+ export declare const pagesByRef: (pages: PageRecord[], basePath: string, byLogical: boolean) => Map<string, PageRecord>;
21
44
  /** Build the complete navigation model from pages, meta, and config. */
22
45
  export declare const buildNavigation: (pages: PageRecord[], options: {
23
46
  /** Plain links in the header, left of the icon buttons. */
@@ -39,6 +62,13 @@ export declare const buildNavigation: (pages: PageRecord[], options: {
39
62
  * group path, e.g. `fr`, `v1.0`, or `v1.0/fr`.
40
63
  */
41
64
  metaPrefix?: string;
65
+ /**
66
+ * Folder-meta lookup prefix of the i18n fallback locale, whose untranslated
67
+ * pages pad this tree (`""` for the default locale of the current
68
+ * version). A group with no meta of this locale's mirrors the fallback
69
+ * locale's. Unset for the fallback locale itself, and without i18n.
70
+ */
71
+ fallbackMetaPrefix?: string;
42
72
  /**
43
73
  * Prefix for shared `meta.$.*` lookups — the version dir inside a
44
74
  * snapshot (`v1.0`), since shared meta is locale-agnostic but still
@@ -60,6 +90,14 @@ export declare const buildNavigation: (pages: PageRecord[], options: {
60
90
  * scoping.
61
91
  */
62
92
  localizedRoot?: string;
93
+ /**
94
+ * The root of the space tab paths are written in, before `basePath`: the
95
+ * current docs' localized root (`"/"`, `/fr`). Defaults to
96
+ * `localizedRoot`; an archived version tree passes it because its own
97
+ * root is versionized (`/fr/v1.0`) while tab paths are not, so a tab's
98
+ * section can be found under the version.
99
+ */
100
+ tabRoot?: string;
63
101
  /**
64
102
  * Sink for diagnostics produced while building the tree (duplicate sidebar
65
103
  * `order` values, index-page title/folder-meta-title mismatches). Pushed
@@ -0,0 +1,4 @@
1
+ /** The digits of `name`'s ordering prefix (`01` of `01-intro`), if it has one. */
2
+ export declare const orderingPrefix: (name: string) => string | undefined;
3
+ /** `name` without its ordering prefix (`01-intro` -> `intro`). */
4
+ export declare const stripOrderingPrefix: (name: string) => string;
@@ -21,6 +21,8 @@ export declare const unsafeLinkSpans: (tree: Root) => UnsafeLinkSpan[];
21
21
  /**
22
22
  * Markdown with every unsafe link reduced to its label text and every unsafe
23
23
  * link definition removed. Everything else — safe links, raw HTML, code —
24
- * passes through as written.
24
+ * passes through as written. The Markdown is read as GitHub-flavored, the way
25
+ * the site renders it: a link inside a footnote definition or a table cell is
26
+ * only a link to a GFM parser.
25
27
  */
26
28
  export declare const neutralizeUnsafeLinks: (markdown: string) => string;
@@ -687,15 +687,7 @@ declare const contentSignalsSchema: z.ZodPipe<z.ZodUnion<readonly [z.ZodBoolean,
687
687
  aiTrain: boolean;
688
688
  search: boolean;
689
689
  }>>;
690
- /**
691
- * How the "last updated" stamp and the changelog timeline render their dates —
692
- * a curated pass-through to `Intl.DateTimeFormat`, shared by both surfaces so
693
- * they read alike. Defaults to `{ dateStyle: "long" }`. Both stamps format in
694
- * UTC unless a `timeZone` is given, so a date reads the same regardless of the
695
- * build machine's zone. `dateStyle` is a preset that can't be combined with the
696
- * individual component fields (`year`, `month`, …), matching `Intl`'s own rule.
697
- */
698
- declare const dateFormatConfigSchema: z.ZodObject<{
690
+ declare const dateFormatConfigSchema: z.ZodPipe<z.ZodObject<{
699
691
  calendar: z.ZodOptional<z.ZodString>;
700
692
  dateStyle: z.ZodOptional<z.ZodEnum<{
701
693
  medium: "medium";
@@ -730,7 +722,27 @@ declare const dateFormatConfigSchema: z.ZodObject<{
730
722
  numeric: "numeric";
731
723
  "2-digit": "2-digit";
732
724
  }>>;
733
- }, z.core.$strict>;
725
+ }, z.core.$strict>, z.ZodTransform<{
726
+ calendar?: string | undefined;
727
+ dateStyle?: "medium" | "full" | "long" | "short" | undefined;
728
+ day?: "numeric" | "2-digit" | undefined;
729
+ era?: "long" | "short" | "narrow" | undefined;
730
+ month?: "long" | "short" | "numeric" | "2-digit" | "narrow" | undefined;
731
+ numberingSystem?: string | undefined;
732
+ timeZone?: string | undefined;
733
+ weekday?: "long" | "short" | "narrow" | undefined;
734
+ year?: "numeric" | "2-digit" | undefined;
735
+ }, {
736
+ calendar?: string | undefined;
737
+ dateStyle?: "medium" | "full" | "long" | "short" | undefined;
738
+ day?: "numeric" | "2-digit" | undefined;
739
+ era?: "long" | "short" | "narrow" | undefined;
740
+ month?: "long" | "short" | "numeric" | "2-digit" | "narrow" | undefined;
741
+ numberingSystem?: string | undefined;
742
+ timeZone?: string | undefined;
743
+ weekday?: "long" | "short" | "narrow" | undefined;
744
+ year?: "numeric" | "2-digit" | undefined;
745
+ }>>;
734
746
  export declare const blumeConfigSchema: z.ZodObject<{
735
747
  agents: z.ZodPrefault<z.ZodObject<{
736
748
  agentReadability: z.ZodDefault<z.ZodBoolean>;
@@ -931,6 +943,13 @@ export declare const blumeConfigSchema: z.ZodObject<{
931
943
  }, z.core.$catchall<z.ZodJSONSchema>>;
932
944
  requiredSecrets: z.ZodArray<z.ZodString>;
933
945
  runtimeDeps: z.ZodArray<z.ZodString>;
946
+ }, z.core.$strict>, z.ZodObject<{
947
+ kind: z.ZodLiteral<"databuddy">;
948
+ options: z.ZodObject<{
949
+ clientId: z.ZodString;
950
+ }, z.core.$catchall<z.ZodString>>;
951
+ requiredSecrets: z.ZodArray<z.ZodString>;
952
+ runtimeDeps: z.ZodArray<z.ZodString>;
934
953
  }, z.core.$strict>, z.ZodObject<{
935
954
  kind: z.ZodLiteral<"fathom">;
936
955
  options: z.ZodObject<{
@@ -2164,7 +2183,7 @@ export declare const blumeConfigSchema: z.ZodObject<{
2164
2183
  runtimeDeps: string[];
2165
2184
  })[] | undefined;
2166
2185
  }>>>;
2167
- dateFormat: z.ZodDefault<z.ZodObject<{
2186
+ dateFormat: z.ZodDefault<z.ZodPipe<z.ZodObject<{
2168
2187
  calendar: z.ZodOptional<z.ZodString>;
2169
2188
  dateStyle: z.ZodOptional<z.ZodEnum<{
2170
2189
  medium: "medium";
@@ -2199,7 +2218,27 @@ export declare const blumeConfigSchema: z.ZodObject<{
2199
2218
  numeric: "numeric";
2200
2219
  "2-digit": "2-digit";
2201
2220
  }>>;
2202
- }, z.core.$strict>>;
2221
+ }, z.core.$strict>, z.ZodTransform<{
2222
+ calendar?: string | undefined;
2223
+ dateStyle?: "medium" | "full" | "long" | "short" | undefined;
2224
+ day?: "numeric" | "2-digit" | undefined;
2225
+ era?: "long" | "short" | "narrow" | undefined;
2226
+ month?: "long" | "short" | "numeric" | "2-digit" | "narrow" | undefined;
2227
+ numberingSystem?: string | undefined;
2228
+ timeZone?: string | undefined;
2229
+ weekday?: "long" | "short" | "narrow" | undefined;
2230
+ year?: "numeric" | "2-digit" | undefined;
2231
+ }, {
2232
+ calendar?: string | undefined;
2233
+ dateStyle?: "medium" | "full" | "long" | "short" | undefined;
2234
+ day?: "numeric" | "2-digit" | undefined;
2235
+ era?: "long" | "short" | "narrow" | undefined;
2236
+ month?: "long" | "short" | "numeric" | "2-digit" | "narrow" | undefined;
2237
+ numberingSystem?: string | undefined;
2238
+ timeZone?: string | undefined;
2239
+ weekday?: "long" | "short" | "narrow" | undefined;
2240
+ year?: "numeric" | "2-digit" | undefined;
2241
+ }>>>;
2203
2242
  deployment: z.ZodPrefault<z.ZodPipe<z.ZodDiscriminatedUnion<[z.ZodObject<{
2204
2243
  kind: z.ZodLiteral<"cloudflare">;
2205
2244
  options: z.ZodObject<{
@@ -2441,7 +2480,7 @@ export declare const blumeConfigSchema: z.ZodObject<{
2441
2480
  tag: z.ZodOptional<z.ZodString>;
2442
2481
  }, z.core.$strict>>>;
2443
2482
  label: z.ZodUnion<readonly [z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>]>;
2444
- path: z.ZodString;
2483
+ path: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
2445
2484
  }, z.core.$strict>>>;
2446
2485
  }, z.core.$strict>>;
2447
2486
  react: z.ZodPrefault<z.ZodObject<{
@@ -20,6 +20,11 @@ export interface GithubReleasesSourceOptions {
20
20
  prereleases?: boolean;
21
21
  /** Repository name. */
22
22
  repo: string;
23
+ /**
24
+ * The site's own URL (`deployment.site`). A link in the notes back to it
25
+ * becomes root-relative, the way a page links to another page.
26
+ */
27
+ site?: string;
23
28
  }
24
29
  /**
25
30
  * GitHub Releases content source. Pulls a repo's releases from the REST API and
@@ -18,6 +18,15 @@ export interface InlineMarks {
18
18
  * CommonMark rule that keeps the padding out of the rendered code).
19
19
  */
20
20
  export declare const codeSpan: (code: string) => string;
21
+ /**
22
+ * A block's inline text, guarded where only the whole block can tell. Runs
23
+ * are escaped one at a time, but "import" ending one run and a space or code
24
+ * span opening the next form an MDX `import` statement only once they are
25
+ * joined, and whitespace the first runs put in front of a block turns it into
26
+ * an indented code block. Apply it to the joined text of a paragraph,
27
+ * heading, quote, or list item — never to code.
28
+ */
29
+ export declare const guardBlockStart: (text: string) => string;
21
30
  /**
22
31
  * Wrap a text run in the Markdown for its marks. Code stays verbatim inside
23
32
  * the backticks (an escape would render as a backslash); everything else is
@@ -26,7 +35,7 @@ export declare const codeSpan: (code: string) => string;
26
35
  * routinely bold a word together with the space after it.
27
36
  */
28
37
  export declare const renderInline: (text: string, marks: InlineMarks) => string;
29
- /** A link or image destination as Markdown can carry it verbatim. */
38
+ /** A link or image destination as Markdown carries it verbatim. */
30
39
  export declare const destination: (url: string) => string;
31
40
  /**
32
41
  * A Markdown link, or the label alone when the target is missing — or unsafe:
@@ -46,7 +55,10 @@ export declare const blockquote: (text: string) => string;
46
55
  export declare const listItem: (marker: string, body: string) => string;
47
56
  /** Indent every non-empty line, for a nested list hanging off an item. */
48
57
  export declare const indent: (text: string, width: number) => string;
49
- /** A fenced code block whose fence outruns any backtick run in the code. */
58
+ /**
59
+ * A fenced code block whose fence outruns any backtick run in the code,
60
+ * labeled with its language when that is one word a fence can carry.
61
+ */
50
62
  export declare const codeFence: (code: string, language?: string) => string;
51
63
  /** A Markdown image; the alt is escaped so a `]` in a caption can't close it. */
52
64
  export declare const image: (alt: string, url: string) => string;