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
@@ -9,7 +9,7 @@ import {
9
9
  import {
10
10
  AGENTS,
11
11
  launchInstalledAgent
12
- } from "./chunk-qwsrynx5.js";
12
+ } from "./chunk-6k4ftwze.js";
13
13
 
14
14
  // src/cli/commands/migrate.ts
15
15
  import { defineCommand } from "citty";
@@ -173,4 +173,4 @@ export {
173
173
  };
174
174
 
175
175
  //# debugId=A9196D6CE8B0C0B464756E2164756E21
176
- //# sourceMappingURL=chunk-s6jhgk0q.js.map
176
+ //# sourceMappingURL=chunk-zp79m0ts.js.map
package/dist/cli/index.js CHANGED
@@ -123,7 +123,13 @@ var loadEnvFiles = (startDir) => {
123
123
  done = existsSync2(join3(dir, ".git")) || parent === dir;
124
124
  dir = parent;
125
125
  }
126
- config({ path: paths, quiet: true });
126
+ const loaded = {};
127
+ config({ path: paths, processEnv: loaded, quiet: true });
128
+ for (const [key, value] of Object.entries(loaded)) {
129
+ if (key !== "NODE_ENV" && process.env[key] === undefined) {
130
+ process.env[key] = value;
131
+ }
132
+ }
127
133
  };
128
134
 
129
135
  // src/cli/host-args.ts
@@ -239,30 +245,149 @@ var enrichDiagnostic = (diagnostic) => diagnostic.docsUrl ? diagnostic : { ...di
239
245
  var REGEXP_SPECIAL = /[$()*+.?[\\\]^{|}]/gu;
240
246
  var escapeRegExp = (value) => value.replaceAll(REGEXP_SPECIAL, String.raw`\$&`);
241
247
  var isKeySegment = (segment) => typeof segment === "string";
242
- var stepSegment = (source, segment, cursor) => {
243
- if (!isKeySegment(segment)) {
244
- return { index: -1, next: cursor, stop: false };
248
+ var QUOTES = new Set(['"', "'", "`"]);
249
+ var OPENERS = new Set(["(", "[", "{"]);
250
+ var CLOSERS = new Set([")", "]", "}"]);
251
+ var WHITESPACE = /\s/u;
252
+ var skipComment = (source, index) => {
253
+ if (source.startsWith("//", index) && source.charAt(index - 1) !== ":") {
254
+ const end = source.indexOf(`
255
+ `, index);
256
+ return end === -1 ? source.length : end;
257
+ }
258
+ if (source.startsWith("/*", index)) {
259
+ const end = source.indexOf("*/", index + 2);
260
+ return end === -1 ? source.length : end + 2;
261
+ }
262
+ return index;
263
+ };
264
+ var skipString = (source, index) => {
265
+ const quote = source.charAt(index);
266
+ if (!QUOTES.has(quote)) {
267
+ return index;
268
+ }
269
+ let cursor = index + 1;
270
+ while (cursor < source.length) {
271
+ const char = source.charAt(cursor);
272
+ if (char === quote) {
273
+ return cursor + 1;
274
+ }
275
+ if (char === `
276
+ ` && quote !== "`") {
277
+ return index;
278
+ }
279
+ cursor += char === "\\" ? 2 : 1;
280
+ }
281
+ return index;
282
+ };
283
+ var scanLiteral = (source, open) => {
284
+ const entries = [];
285
+ let depth = 0;
286
+ let pending = true;
287
+ let index = open + 1;
288
+ while (index < source.length) {
289
+ const afterComment = skipComment(source, index);
290
+ const char = source.charAt(index);
291
+ if (afterComment !== index || WHITESPACE.test(char)) {
292
+ index = Math.max(afterComment, index + 1);
293
+ continue;
294
+ }
295
+ if (depth === 0 && CLOSERS.has(char)) {
296
+ return { end: index, entries };
297
+ }
298
+ if (depth === 0 && pending) {
299
+ entries.push(index);
300
+ pending = false;
301
+ }
302
+ const afterString = skipString(source, index);
303
+ if (afterString !== index) {
304
+ index = afterString;
305
+ continue;
306
+ }
307
+ if (OPENERS.has(char)) {
308
+ depth += 1;
309
+ } else if (CLOSERS.has(char)) {
310
+ depth -= 1;
311
+ } else if (char === "," && depth === 0) {
312
+ pending = true;
313
+ }
314
+ index += 1;
315
+ }
316
+ return { end: source.length, entries };
317
+ };
318
+ var indentedBlock = (source, anchor, limit) => {
319
+ const column = anchor - (source.lastIndexOf(`
320
+ `, anchor - 1) + 1);
321
+ const lineEnd = source.indexOf(`
322
+ `, anchor);
323
+ const start = lineEnd === -1 ? limit : Math.min(lineEnd + 1, limit);
324
+ let end = start;
325
+ while (end < limit) {
326
+ const next = source.indexOf(`
327
+ `, end);
328
+ const after = next === -1 || next >= limit ? limit : next + 1;
329
+ const line = source.slice(end, after);
330
+ if (line.trim() !== "" && line.length - line.trimStart().length <= column) {
331
+ break;
332
+ }
333
+ end = after;
245
334
  }
246
- const matcher = new RegExp(`(?<![\\w$])${escapeRegExp(segment)}\\s*[:=]`, "gu");
247
- matcher.lastIndex = cursor;
248
- const match = matcher.exec(source);
249
- if (!match) {
250
- return { index: -1, next: cursor, stop: true };
335
+ return { end, entries: [], kind: "block", start };
336
+ };
337
+ var VALUE_LEAD = /[\s\w$.(]*/uy;
338
+ var valueScope = (source, step, limit) => {
339
+ VALUE_LEAD.lastIndex = step.next;
340
+ VALUE_LEAD.exec(source);
341
+ const open = VALUE_LEAD.lastIndex;
342
+ const char = source.charAt(open);
343
+ if (open < limit && (char === "{" || char === "[")) {
344
+ const literal = scanLiteral(source, open);
345
+ return {
346
+ end: literal.end,
347
+ entries: literal.entries,
348
+ kind: char === "{" ? "object" : "array",
349
+ start: open
350
+ };
251
351
  }
252
- return { index: match.index, next: matcher.lastIndex, stop: false };
352
+ return indentedBlock(source, step.index, limit);
353
+ };
354
+ var findKey = (source, scope, segment) => {
355
+ const key = escapeRegExp(segment);
356
+ const pattern = `(?<![\\w$])(?:${key}|"${key}"|'${key}')\\s*[:=]`;
357
+ if (scope.kind === "block") {
358
+ const matcher = new RegExp(pattern, "gu");
359
+ matcher.lastIndex = scope.start;
360
+ const match = matcher.exec(source);
361
+ return match && match.index < scope.end ? { index: match.index, next: matcher.lastIndex } : undefined;
362
+ }
363
+ const matcher = new RegExp(pattern, "uy");
364
+ for (const entry of scope.kind === "object" ? scope.entries : []) {
365
+ matcher.lastIndex = entry;
366
+ if (matcher.test(source)) {
367
+ return { index: entry, next: matcher.lastIndex };
368
+ }
369
+ }
370
+ return;
371
+ };
372
+ var findElement = (scope, position) => {
373
+ const index = scope.kind === "array" ? scope.entries[position] : undefined;
374
+ return index === undefined ? undefined : { index, next: index };
253
375
  };
254
376
  var locatePath = (source, path) => {
255
- let cursor = 0;
377
+ let scope = {
378
+ end: source.length,
379
+ entries: [],
380
+ kind: "block",
381
+ start: 0
382
+ };
256
383
  let found = -1;
257
384
  for (const segment of path) {
258
- const step = stepSegment(source, segment, cursor);
259
- if (step.stop) {
385
+ const step = isKeySegment(segment) ? findKey(source, scope, segment) : findElement(scope, segment);
386
+ if (!step) {
260
387
  break;
261
388
  }
262
- cursor = step.next;
263
- if (step.index >= 0) {
264
- found = step.index;
265
- }
389
+ found = step.index;
390
+ scope = valueScope(source, step, scope.end);
266
391
  }
267
392
  if (found < 0) {
268
393
  return;
@@ -553,23 +678,23 @@ var main = defineCommand({
553
678
  version: getBlumeVersion()
554
679
  },
555
680
  subCommands: {
556
- add: lazyCommand(commandMeta.add, () => import("./chunk-fxypxtvm.js"), "addCommand"),
557
- audit: lazyCommand(commandMeta.audit, () => import("./chunk-79jhk4py.js"), "auditCommand"),
558
- build: lazyCommand(commandMeta.build, () => import("./chunk-s1p84fyh.js"), "buildCommand"),
559
- check: lazyCommand(commandMeta.check, () => import("./chunk-epjnccmv.js"), "checkCommand"),
560
- dev: lazyCommand(commandMeta.dev, () => import("./chunk-kdp5q7ke.js"), "devCommand"),
561
- doctor: lazyCommand(commandMeta.doctor, () => import("./chunk-6vm74dry.js"), "doctorCommand"),
562
- eject: lazyCommand(commandMeta.eject, () => import("./chunk-f2z5v128.js"), "ejectCommand"),
563
- eval: lazyCommand(commandMeta.eval, () => import("./chunk-jwyddg7y.js"), "evalCommand"),
564
- init: lazyCommand(commandMeta.init, () => import("./chunk-q5163e60.js"), "initCommand"),
565
- "mcp-stdio": lazyCommand(commandMeta["mcp-stdio"], () => import("./chunk-yw7dm696.js"), "mcpStdioCommand"),
566
- migrate: lazyCommand(commandMeta.migrate, () => import("./chunk-s6jhgk0q.js"), "migrateCommand"),
567
- preview: lazyCommand(commandMeta.preview, () => import("./chunk-mb2919y2.js"), "previewCommand"),
568
- sync: lazyCommand(commandMeta.sync, () => import("./chunk-fz5wtpmh.js"), "syncCommand"),
569
- translate: lazyCommand(commandMeta.translate, () => import("./chunk-kpf8rrjc.js"), "translateCommand"),
570
- upgrade: lazyCommand(commandMeta.upgrade, () => import("./chunk-m3vmjgmq.js"), "upgradeCommand"),
571
- validate: lazyCommand(commandMeta.validate, () => import("./chunk-ch6g3ar0.js"), "validateCommand"),
572
- version: lazyCommand(commandMeta.version, () => import("./chunk-hdpx1tax.js"), "versionCommand")
681
+ add: lazyCommand(commandMeta.add, () => import("./chunk-bbnwccaz.js"), "addCommand"),
682
+ audit: lazyCommand(commandMeta.audit, () => import("./chunk-hqp2ajnh.js"), "auditCommand"),
683
+ build: lazyCommand(commandMeta.build, () => import("./chunk-k7pj68a8.js"), "buildCommand"),
684
+ check: lazyCommand(commandMeta.check, () => import("./chunk-91ws1n6j.js"), "checkCommand"),
685
+ dev: lazyCommand(commandMeta.dev, () => import("./chunk-8g8ytmgx.js"), "devCommand"),
686
+ doctor: lazyCommand(commandMeta.doctor, () => import("./chunk-6dtt0zfn.js"), "doctorCommand"),
687
+ eject: lazyCommand(commandMeta.eject, () => import("./chunk-d1v5rhy0.js"), "ejectCommand"),
688
+ eval: lazyCommand(commandMeta.eval, () => import("./chunk-ppzjqwx2.js"), "evalCommand"),
689
+ init: lazyCommand(commandMeta.init, () => import("./chunk-7vtckvaw.js"), "initCommand"),
690
+ "mcp-stdio": lazyCommand(commandMeta["mcp-stdio"], () => import("./chunk-3yce002v.js"), "mcpStdioCommand"),
691
+ migrate: lazyCommand(commandMeta.migrate, () => import("./chunk-zp79m0ts.js"), "migrateCommand"),
692
+ preview: lazyCommand(commandMeta.preview, () => import("./chunk-nfcyttvj.js"), "previewCommand"),
693
+ sync: lazyCommand(commandMeta.sync, () => import("./chunk-w4bxdvsa.js"), "syncCommand"),
694
+ translate: lazyCommand(commandMeta.translate, () => import("./chunk-pbg5a4s3.js"), "translateCommand"),
695
+ upgrade: lazyCommand(commandMeta.upgrade, () => import("./chunk-bfwp9vp6.js"), "upgradeCommand"),
696
+ validate: lazyCommand(commandMeta.validate, () => import("./chunk-n1yg3tj3.js"), "validateCommand"),
697
+ version: lazyCommand(commandMeta.version, () => import("./chunk-g698a744.js"), "versionCommand")
573
698
  }
574
699
  });
575
700
  loadEnvFiles(process.cwd());
@@ -604,5 +729,5 @@ export {
604
729
  closestMatch
605
730
  };
606
731
 
607
- //# debugId=3B8E364FC63CDED364756E2164756E21
732
+ //# debugId=FDC6644211D8A03B64756E2164756E21
608
733
  //# sourceMappingURL=index.js.map
@@ -6,15 +6,15 @@
6
6
  "import { readFileSync } from \"node:fs\";\n\nimport { join } from \"pathe\";\n\nimport { packageRoot } from \"./package-root.ts\";\n\nlet cached: string | undefined;\n\n/**\n * The installed Blume package version, read lazily from its `package.json`.\n *\n * Computed on demand (not at module load) so importing the `blume` barrel has no\n * filesystem side effect, and anchored at the package root so it resolves the\n * same whether running from source or the bundled CLI.\n */\nexport const getBlumeVersion = (): string => {\n if (cached === undefined) {\n const pkgPath = join(packageRoot(), \"package.json\");\n // SAFETY: this reads blume's own package.json, which always declares a\n // `version` (publishing requires it).\n cached = (JSON.parse(readFileSync(pkgPath, \"utf-8\")) as { version: string })\n .version;\n }\n return cached;\n};\n",
7
7
  "import { existsSync } from \"node:fs\";\n\nimport { dirname, join } from \"pathe\";\n\n/**\n * Walk up from `start` until a directory containing a `package.json` is found.\n *\n * Exported for testing; call sites should use {@link packageRoot}.\n */\nexport const findPackageRoot = (start: string): string => {\n let dir = start;\n while (!existsSync(join(dir, \"package.json\"))) {\n const parent = dirname(dir);\n if (parent === dir) {\n throw new Error(\"blume: unable to locate the package root\");\n }\n dir = parent;\n }\n return dir;\n};\n\nlet cached: string | undefined;\n\n/**\n * Absolute path to the installed Blume package root (the directory holding its\n * `package.json`), found by walking up from this module.\n *\n * Anchoring here — rather than at a fixed offset from `import.meta` — keeps the\n * package's own `src/`, assets, and `node_modules` locatable whether the code\n * runs from source under Bun (`src/...`) or from the published, bundled CLI\n * (`dist/cli/*.js`). The two layouts sit at different depths, so a relative\n * `../..` resolves to different places; locating `package.json` does not.\n */\nexport const packageRoot = (): string => {\n cached ??= findPackageRoot(import.meta.dirname);\n return cached;\n};\n",
8
8
  "import type { CommandMeta } from \"citty\";\n\n/**\n * Every command's `meta`, held apart from the command modules themselves.\n *\n * The CLI entry loads each command lazily (see `lazy-command.ts`), but citty\n * still reads every subcommand's `meta` to render `blume --help` and to match\n * an unknown name against aliases. Keeping that table here lets those paths\n * run without importing a single command module — `dev` alone drags in Astro,\n * `mcp-stdio` the MCP SDK. The command modules read their `meta` from this\n * table too, so the entry and the command can't drift.\n */\nexport const commandMeta = {\n add: {\n description: \"Install a source component or template from the registry.\",\n name: \"add\",\n },\n audit: {\n description: \"Audit the built site for SEO and site-health issues.\",\n name: \"audit\",\n },\n build: {\n description: \"Build the docs site for production.\",\n name: \"build\",\n },\n check: {\n description: \"Type-check the docs site with astro check.\",\n name: \"check\",\n },\n dev: {\n description: \"Start the Blume development server.\",\n name: \"dev\",\n },\n doctor: {\n description: \"Diagnose common configuration and content problems.\",\n name: \"doctor\",\n },\n eject: {\n description: \"Promote the generated runtime into an owned Astro project.\",\n name: \"eject\",\n },\n eval: {\n description:\n \"Test the docs: an agent answers your questions using only the documentation.\",\n name: \"eval\",\n },\n init: {\n description: \"Scaffold a minimal Blume project.\",\n name: \"init\",\n },\n \"mcp-stdio\": {\n description:\n \"Serve an MCP data snapshot over stdio (internal, used by `blume eval`).\",\n name: \"mcp-stdio\",\n },\n migrate: {\n description:\n \"Migrate a docs site from Mintlify, Fumadocs, Docusaurus, Starlight, or Nextra with a coding agent.\",\n name: \"migrate\",\n },\n preview: {\n description: \"Preview the last production build.\",\n name: \"preview\",\n },\n sync: {\n description: \"Re-fetch remote content sources and regenerate the runtime.\",\n name: \"sync\",\n },\n translate: {\n description:\n \"Translate docs into the configured locales with a local agent CLI.\",\n name: \"translate\",\n },\n upgrade: {\n description:\n \"Upgrade to this version of Blume: bump the dependency and list the config changes left.\",\n name: \"upgrade\",\n },\n validate: {\n description: \"Validate internal, anchor, asset, and external links.\",\n name: \"validate\",\n },\n version: {\n description: \"Freeze the current docs as an archived version.\",\n name: \"version\",\n },\n} satisfies Record<string, CommandMeta>;\n",
9
- "import { existsSync } from \"node:fs\";\n\nimport { config } from \"dotenv\";\nimport { dirname, join, resolve } from \"pathe\";\n\n// Blume's remote sources (GitHub Releases, mdx-remote, Sanity, Notion…) read\n// their tokens from `process.env` during the content scan — which runs before\n// Astro/Vite boots, so Vite's own `.env` loading is too late. This loader fills\n// that gap: it cascades `.env`/`.env.local` from the working dir up to the repo\n// root, so a monorepo can keep one `.env` at the root and every app picks it up.\n\n/**\n * Load `.env`/`.env.local`, cascading from `startDir` up to the repository root\n * (the first ancestor containing a `.git`) or the filesystem root. The ordered\n * path list is handed to dotenv, whose `config` is first-wins, never clobbers\n * existing `process.env` values, and treats unreadable files as best-effort —\n * so shell/CI overrides are never lost, `.env.local` layers over `.env`, and a\n * bad file never aborts a build. dotenv is also the parser Vite runs over\n * these files at build time, so a value means the same thing to the pre-boot\n * content scan and the built site — including multi-line double-quoted values\n * (PEM keys), which a line-based parser silently truncates.\n */\nexport const loadEnvFiles = (startDir: string): void => {\n const paths: string[] = [];\n let dir = resolve(startDir);\n let done = false;\n while (!done) {\n paths.push(join(dir, \".env.local\"), join(dir, \".env\"));\n const parent = dirname(dir);\n // Stop at the repo root (nearest `.git`) or the filesystem root.\n done = existsSync(join(dir, \".git\")) || parent === dir;\n dir = parent;\n }\n config({ path: paths, quiet: true });\n};\n",
9
+ "import { existsSync } from \"node:fs\";\n\nimport { config } from \"dotenv\";\nimport { dirname, join, resolve } from \"pathe\";\n\n// Blume's remote sources (GitHub Releases, mdx-remote, Sanity, Notion…) read\n// their tokens from `process.env` during the content scan — which runs before\n// Astro/Vite boots, so Vite's own `.env` loading is too late. This loader fills\n// that gap: it cascades `.env`/`.env.local` from the working dir up to the repo\n// root, so a monorepo can keep one `.env` at the root and every app picks it up.\n\n/**\n * Load `.env`/`.env.local`, cascading from `startDir` up to the repository root\n * (the first ancestor containing a `.git`) or the filesystem root. The ordered\n * path list is handed to dotenv, whose `config` is first-wins, never clobbers\n * existing `process.env` values, and treats unreadable files as best-effort —\n * so shell/CI overrides are never lost, `.env.local` layers over `.env`, and a\n * bad file never aborts a build. dotenv is also the parser Vite runs over\n * these files at build time, so a value means the same thing to the pre-boot\n * content scan and the built site — including multi-line double-quoted values\n * (PEM keys), which a line-based parser silently truncates.\n *\n * `NODE_ENV` is never taken from these files: it picks the mode Vite and Astro\n * run in, so a monorepo root `.env` that sets it for another app would turn\n * every `blume build` into a development build (or `blume dev` into a\n * production one).\n */\nexport const loadEnvFiles = (startDir: string): void => {\n const paths: string[] = [];\n let dir = resolve(startDir);\n let done = false;\n while (!done) {\n paths.push(join(dir, \".env.local\"), join(dir, \".env\"));\n const parent = dirname(dir);\n // Stop at the repo root (nearest `.git`) or the filesystem root.\n done = existsSync(join(dir, \".git\")) || parent === dir;\n dir = parent;\n }\n const loaded: Record<string, string> = {};\n config({ path: paths, processEnv: loaded, quiet: true });\n for (const [key, value] of Object.entries(loaded)) {\n if (key !== \"NODE_ENV\" && process.env[key] === undefined) {\n process.env[key] = value;\n }\n }\n};\n",
10
10
  "/**\n * Rewrite a bare `--host` in the raw argv to `--host=` before citty parses it.\n *\n * `host` is a string arg (citty has no mixed string/boolean type), and citty\n * 0.2 parses with `node:util.parseArgs`, where a string option consumes the\n * next token as its value even when that token is another flag: `blume dev\n * --host --open` would bind the literal hostname \"--open\" and drop `--open`.\n * The `--host=` spelling parses as `\"\"` without touching its neighbor, which\n * `normalizeHost` then maps to Astro's \"bind all interfaces\".\n */\nexport const normalizeHostArgs = (rawArgs: readonly string[]): string[] =>\n rawArgs.map((arg, index) => {\n if (arg !== \"--host\") {\n return arg;\n }\n const next = rawArgs[index + 1];\n return next === undefined || next.startsWith(\"-\") ? \"--host=\" : arg;\n });\n\n/**\n * Resolve a `--host` flag value into what Astro/Vite's `server.host` expects.\n * citty has no mixed string/boolean arg type, so `host` is declared as a\n * string and a bare `--host` parses as `\"\"` (`normalizeHostArgs` rewrites it\n * to `--host=` first) — Node would bind all interfaces for `\"\"`, but Vite's\n * `resolveHostname` treats it as a literal hostname and prints malformed URLs\n * like `http://:4321/`. Match Astro's own `--host` semantics instead: bare\n * flag → `true` (bind all interfaces), `--host 10.0.0.1` → that address,\n * absent → `false` (localhost only).\n *\n * Lives beside `normalizeHostArgs` rather than in `commands/dev.ts` so\n * `preview` can share it without importing the whole dev command graph.\n */\nexport const normalizeHost = (host?: string): boolean | string =>\n host === \"\" ? true : (host ?? false);\n",
11
11
  "import { colors } from \"consola/utils\";\n\nimport { getBlumeVersion } from \"../core/version.ts\";\n\nconst ISSUES_URL = \"https://github.com/haydenbleasel/blume/issues\";\n\n// Absolute paths into the hidden generated runtime — POSIX (`…/.blume/…`) or\n// Windows drive-letter (`C:\\…\\.blume\\…`) — including any trailing `:line:col`,\n// stopping at whitespace or a closing paren.\nconst BLUME_FRAME =\n /(?<abs>(?:\\/[^\\s()]*\\/|[A-Za-z]:\\\\[^\\s()]*\\\\)\\.blume[/\\\\][^\\s()]*)/gu;\n\n// The separator immediately before `.blume/` (or `.blume\\`) in a matched path.\nconst BLUME_MARKER = /[/\\\\]\\.blume[/\\\\]/u;\n\n/**\n * Rewrite `.blume/` frames in a stack so the generated runtime reads clearly:\n * the machine-absolute prefix is dropped to a project-relative `.blume/…` path\n * and tagged `(generated)`, keeping the reader oriented instead of staring at a\n * long path into a hidden directory. Frames in the user's own source (custom\n * pages keep their real location; wrappers import user files by their real path)\n * are untouched, so the actionable frame stays intact.\n */\nexport const remapBlumeStack = (stack: string): string =>\n stack.replaceAll(BLUME_FRAME, (match) => {\n const marker = match.search(BLUME_MARKER);\n return `${match.slice(marker + 1)} (generated)`;\n });\n\n/**\n * Print an unexpected (non-{@link BlumeError}) failure in a stable, reportable\n * shape instead of a bare stack trace: a fixed `BLUME_INTERNAL` code, the\n * message, a trimmed stack, and an environment dump for bug reports. Callers\n * exit after this — it doesn't exit itself, so it's testable.\n */\n// oxlint-disable-next-line anti-slop/no-unknown-parameters -- last-resort handler for whatever a catch clause caught; anything narrower would force casts at every call site\nexport const reportInternalError = (error: unknown): void => {\n const err = error instanceof Error ? error : new Error(String(error));\n const lines = [\n `${colors.red(colors.bold(\"BLUME_INTERNAL\"))} An unexpected error occurred.`,\n ` ${err.message}`,\n ];\n\n // A few frames are enough to locate the fault without burying the report;\n // `.blume/` frames are relativized so the hidden runtime reads clearly.\n const stack = remapBlumeStack(err.stack ?? \"\")\n .split(\"\\n\")\n .slice(1, 5)\n .map((line) => line.trim())\n .filter(Boolean);\n if (stack.length > 0) {\n lines.push(\"\", colors.dim(stack.join(\"\\n\")));\n }\n\n lines.push(\n \"\",\n \"This is likely a bug in Blume. Please report it with the details below:\",\n colors.dim(\n [\n ` Blume: ${getBlumeVersion()}`,\n ` Node: ${process.version}`,\n ` Platform: ${process.platform} ${process.arch}`,\n ].join(\"\\n\")\n ),\n ` ${ISSUES_URL}`\n );\n\n process.stderr.write(`${lines.join(\"\\n\")}\\n`);\n};\n",
12
- "import { colors } from \"consola/utils\";\nimport { relative } from \"pathe\";\nimport type { ZodError } from \"zod\";\n\nimport type { Diagnostic } from \"./types.ts\";\n\n/** A recoverable error carrying a structured diagnostic. */\nexport class BlumeError extends Error {\n readonly diagnostic: Diagnostic;\n\n constructor(diagnostic: Diagnostic) {\n super(diagnostic.message);\n this.name = \"BlumeError\";\n this.diagnostic = diagnostic;\n }\n}\n\nexport const createDiagnostic = (diagnostic: Diagnostic): Diagnostic =>\n diagnostic;\n\n/** Docs site base; diagnostic help links resolve against it. */\nconst DOCS_BASE = \"https://useblume.dev\";\n\nconst DOCS_DEPLOYMENT = \"/docs/deployment\";\nconst DOCS_CLI_VALIDATE = \"/docs/cli/validate\";\nconst DOCS_CONTENT_SOURCES = \"/docs/content/sources\";\nconst DOCS_CONTENT_NAVIGATION = \"/docs/content/navigation\";\nconst DOCS_CONTENT_INCLUDES = \"/docs/content/includes\";\n\n/** Diagnostic code → the docs page that explains it. */\nconst DOCS_PATHS = new Map(\n Object.entries({\n BLUME_ADAPTER_REQUIRED: DOCS_DEPLOYMENT,\n BLUME_ASSETS_UNCHECKED: DOCS_CLI_VALIDATE,\n BLUME_ASSET_FETCH_FAILED: DOCS_CONTENT_SOURCES,\n BLUME_BROKEN_ANCHOR: DOCS_CLI_VALIDATE,\n BLUME_BROKEN_ASSET: DOCS_CLI_VALIDATE,\n BLUME_BROKEN_LINK: DOCS_CLI_VALIDATE,\n BLUME_COMPONENTS_INVALID: \"/docs/configuration/customization\",\n BLUME_CONFIG_INVALID: \"/docs/configuration\",\n BLUME_CONFIG_LOAD_FAILED: \"/docs/configuration\",\n BLUME_CONTENT_ROOT_MISSING: DOCS_CONTENT_SOURCES,\n BLUME_DEAD_LINK: DOCS_CLI_VALIDATE,\n BLUME_DEPENDENCY_MISSING: \"/docs/cli/doctor\",\n BLUME_DUPLICATE_ROUTE: DOCS_CONTENT_NAVIGATION,\n BLUME_DUPLICATE_SIDEBAR_ORDER: DOCS_CONTENT_NAVIGATION,\n BLUME_FRONTMATTER_INVALID: \"/docs/content/frontmatter\",\n BLUME_INCLUDE_CYCLE: DOCS_CONTENT_INCLUDES,\n BLUME_INCLUDE_MALFORMED: DOCS_CONTENT_INCLUDES,\n BLUME_INCLUDE_NOT_FOUND: DOCS_CONTENT_INCLUDES,\n BLUME_INCLUDE_OUTSIDE_ROOT: DOCS_CONTENT_INCLUDES,\n BLUME_MDX_CURLY_ANCHOR: \"/docs/content/syntax\",\n\n BLUME_META_INVALID: \"/docs/content/meta\",\n BLUME_META_LOAD_FAILED: \"/docs/content/meta\",\n BLUME_MISSING_SECRET: DOCS_DEPLOYMENT,\n BLUME_NAV_DUPLICATE_LABEL: DOCS_CONTENT_NAVIGATION,\n BLUME_NAV_HIDDEN_IN_SIDEBAR: DOCS_CONTENT_NAVIGATION,\n BLUME_NAV_INDEX_TITLE_MISMATCH: DOCS_CONTENT_NAVIGATION,\n BLUME_NAV_MISSING_PAGE: DOCS_CONTENT_NAVIGATION,\n BLUME_NODE_VERSION: \"/docs/quickstart\",\n BLUME_SERVER_FEATURE_REQUIRED: DOCS_DEPLOYMENT,\n BLUME_SIDEBAR_DISPLAY_IGNORED: DOCS_CONTENT_NAVIGATION,\n BLUME_SOURCE_FETCH_FAILED: DOCS_CONTENT_SOURCES,\n BLUME_SOURCE_MISCONFIGURED: DOCS_CONTENT_SOURCES,\n BLUME_SOURCE_OFFLINE: DOCS_CONTENT_SOURCES,\n BLUME_SOURCE_SDK_MISSING: DOCS_CONTENT_SOURCES,\n BLUME_SOURCE_UNAVAILABLE: DOCS_CONTENT_SOURCES,\n BLUME_TRANSLATE_MISSING: \"/docs/cli/translate\",\n BLUME_TRANSLATE_STALE: \"/docs/cli/translate\",\n BLUME_UNKNOWN_COMPONENT: \"/docs/configuration/customization\",\n BLUME_UNKNOWN_ICON: DOCS_CONTENT_NAVIGATION,\n BLUME_UNKNOWN_OPTION: \"/docs/cli\",\n BLUME_WIKILINK_AMBIGUOUS: DOCS_CONTENT_SOURCES,\n BLUME_WIKILINK_UNRESOLVED: DOCS_CONTENT_SOURCES,\n BLUME_YARN_PNP: \"/docs/quickstart\",\n })\n);\n\n/** The docs URL that explains a diagnostic code, if one is mapped. */\nexport const resolveDocsUrl = (code: string): string | undefined => {\n const path = DOCS_PATHS.get(code);\n return path ? `${DOCS_BASE}${path}` : undefined;\n};\n\n/** Fill in `docsUrl` from the code map where a diagnostic doesn't set its own. */\nexport const enrichDiagnostic = (diagnostic: Diagnostic): Diagnostic =>\n diagnostic.docsUrl\n ? diagnostic\n : { ...diagnostic, docsUrl: resolveDocsUrl(diagnostic.code) };\n\nconst REGEXP_SPECIAL = /[$()*+.?[\\\\\\]^{|}]/gu;\nconst escapeRegExp = (value: string): string =>\n value.replaceAll(REGEXP_SPECIAL, String.raw`\\$&`);\n\n/** A key segment scans the source text; an array index has no key to find. */\nconst isKeySegment = (segment: string | number): segment is string =>\n typeof segment === \"string\";\n\n/**\n * Best-effort source position for a Zod issue path (e.g. `[\"seo\", \"title\"]`) in\n * the raw config / frontmatter text. Narrows key-by-key — finding each string\n * segment as a `key:`/`key =` at or after the previous match — so a nested key\n * lands under its parent. Array indices are skipped. Returns 1-based line/column,\n * or undefined when nothing matches.\n */\nconst stepSegment = (\n source: string,\n segment: string | number,\n cursor: number\n) => {\n // A non-string path segment (array index) is skipped without moving on.\n if (!isKeySegment(segment)) {\n return { index: -1, next: cursor, stop: false };\n }\n // The negative lookbehind keeps a segment like `title` from matching the\n // tail of an unrelated key such as `subtitle:`.\n const matcher = new RegExp(\n `(?<![\\\\w$])${escapeRegExp(segment)}\\\\s*[:=]`,\n \"gu\"\n );\n matcher.lastIndex = cursor;\n const match = matcher.exec(source);\n if (!match) {\n return { index: -1, next: cursor, stop: true };\n }\n return { index: match.index, next: matcher.lastIndex, stop: false };\n};\n\nconst locatePath = (\n source: string,\n path: readonly (string | number)[]\n): { column: number; line: number } | undefined => {\n let cursor = 0;\n let found = -1;\n for (const segment of path) {\n const step = stepSegment(source, segment, cursor);\n if (step.stop) {\n break;\n }\n cursor = step.next;\n if (step.index >= 0) {\n found = step.index;\n }\n }\n if (found < 0) {\n return;\n }\n const before = source.slice(0, found);\n const lastNewline = before.lastIndexOf(\"\\n\");\n return { column: found - lastNewline, line: before.split(\"\\n\").length };\n};\n\n/** The YAML front matter block of a `.md`/`.mdx` source, if it has one. */\nconst FRONTMATTER = /^---\\r?\\n(?<body>[\\s\\S]*?)\\r?\\n---/u;\n\n/**\n * Locate a front matter key in a content file, e.g. `[\"seo\", \"description\"]` in\n * `docs/api.mdx`. Scoped to the front matter block so a `title:` written in the\n * page body can't be mistaken for the front matter key of the same name; returns\n * undefined when the file has no front matter or the key isn't set (a missing\n * key has no line to point at — callers anchor to the file instead).\n */\nexport const locateFrontmatterKey = (\n source: string,\n path: readonly (string | number)[]\n): { column: number; line: number } | undefined => {\n const block = FRONTMATTER.exec(source);\n if (!block) {\n return;\n }\n // `locatePath` reports lines 1-based within the text it was given, and the\n // front matter body starts one line below the opening `---`.\n const position = locatePath(block.groups?.body ?? \"\", path);\n return position && { column: position.column, line: position.line + 1 };\n};\n\n/**\n * Convert generic validation issues (message + path, the shape shared by Zod\n * and Standard Schema issues) into Blume diagnostics, anchored to a file.\n */\nexport const diagnosticsFromIssues = (\n issues: readonly {\n message: string;\n path: readonly (string | number)[];\n }[],\n options: { code: string; file?: string; source?: string }\n): Diagnostic[] =>\n issues.map((issue) => {\n const schemaPath = issue.path.join(\".\");\n const position = options.source\n ? locatePath(options.source, issue.path)\n : undefined;\n return {\n code: options.code,\n column: position?.column,\n file: options.file,\n line: position?.line,\n message: schemaPath ? `${schemaPath}: ${issue.message}` : issue.message,\n schemaPath: schemaPath || undefined,\n severity: \"error\",\n } satisfies Diagnostic;\n });\n\n/** Convert a ZodError into Blume diagnostics, anchored to a file. */\nexport const diagnosticsFromZod = (\n error: ZodError,\n options: { code: string; file?: string; source?: string }\n): Diagnostic[] =>\n diagnosticsFromIssues(\n error.issues.map((issue) => ({\n message: issue.message,\n // Zod 4 paths are PropertyKey[]; a symbol segment has no place in a\n // dotted schema path or a source-position scan.\n path: issue.path.filter(\n (segment): segment is string | number => typeof segment !== \"symbol\"\n ),\n })),\n options\n );\n\nconst severityColor = (severity: Diagnostic[\"severity\"]) => {\n if (severity === \"error\") {\n return colors.red;\n }\n if (severity === \"warning\") {\n return colors.yellow;\n }\n return colors.blue;\n};\n\n/** Format a single diagnostic for terminal output. */\nexport const formatDiagnostic = (\n diagnostic: Diagnostic,\n root?: string\n): string => {\n const color = severityColor(diagnostic.severity);\n const lines: string[] = [\n `${color(colors.bold(diagnostic.code))} ${diagnostic.message}`,\n ];\n\n // An audit finding is about a built URL, and names the source file that fixes\n // it as a second line (\"at /docs/api\" / \"in docs/api.mdx:3:2\"). Everything\n // else is about a file alone, and keeps the original single `at file` line.\n if (diagnostic.url) {\n lines.push(` ${colors.dim(`at ${diagnostic.url}`)}`);\n }\n if (diagnostic.file) {\n const location = root ? relative(root, diagnostic.file) : diagnostic.file;\n const column =\n diagnostic.column === undefined ? \"\" : `:${diagnostic.column}`;\n const position =\n diagnostic.line === undefined ? \"\" : `:${diagnostic.line}${column}`;\n const label = diagnostic.url ? \"in\" : \"at\";\n lines.push(` ${colors.dim(`${label} ${location}${position}`)}`);\n }\n\n if (diagnostic.suggestion) {\n lines.push(` ${colors.cyan(`fix: ${diagnostic.suggestion}`)}`);\n }\n\n if (diagnostic.docsUrl) {\n lines.push(` ${colors.dim(`docs: ${diagnostic.docsUrl}`)}`);\n }\n\n return lines.join(\"\\n\");\n};\n\nexport const hasErrors = (diagnostics: Diagnostic[]): boolean =>\n diagnostics.some((d) => d.severity === \"error\");\n\nexport const countBySeverity = (diagnostics: Diagnostic[]) => {\n const counts = { error: 0, info: 0, warning: 0 } satisfies Record<\n Diagnostic[\"severity\"],\n number\n >;\n for (const diagnostic of diagnostics) {\n counts[diagnostic.severity] += 1;\n }\n return counts;\n};\n",
12
+ "import { colors } from \"consola/utils\";\nimport { relative } from \"pathe\";\nimport type { ZodError } from \"zod\";\n\nimport type { Diagnostic } from \"./types.ts\";\n\n/** A recoverable error carrying a structured diagnostic. */\nexport class BlumeError extends Error {\n readonly diagnostic: Diagnostic;\n\n constructor(diagnostic: Diagnostic) {\n super(diagnostic.message);\n this.name = \"BlumeError\";\n this.diagnostic = diagnostic;\n }\n}\n\nexport const createDiagnostic = (diagnostic: Diagnostic): Diagnostic =>\n diagnostic;\n\n/** Docs site base; diagnostic help links resolve against it. */\nconst DOCS_BASE = \"https://useblume.dev\";\n\nconst DOCS_DEPLOYMENT = \"/docs/deployment\";\nconst DOCS_CLI_VALIDATE = \"/docs/cli/validate\";\nconst DOCS_CONTENT_SOURCES = \"/docs/content/sources\";\nconst DOCS_CONTENT_NAVIGATION = \"/docs/content/navigation\";\nconst DOCS_CONTENT_INCLUDES = \"/docs/content/includes\";\n\n/** Diagnostic code → the docs page that explains it. */\nconst DOCS_PATHS = new Map(\n Object.entries({\n BLUME_ADAPTER_REQUIRED: DOCS_DEPLOYMENT,\n BLUME_ASSETS_UNCHECKED: DOCS_CLI_VALIDATE,\n BLUME_ASSET_FETCH_FAILED: DOCS_CONTENT_SOURCES,\n BLUME_BROKEN_ANCHOR: DOCS_CLI_VALIDATE,\n BLUME_BROKEN_ASSET: DOCS_CLI_VALIDATE,\n BLUME_BROKEN_LINK: DOCS_CLI_VALIDATE,\n BLUME_COMPONENTS_INVALID: \"/docs/configuration/customization\",\n BLUME_CONFIG_INVALID: \"/docs/configuration\",\n BLUME_CONFIG_LOAD_FAILED: \"/docs/configuration\",\n BLUME_CONTENT_ROOT_MISSING: DOCS_CONTENT_SOURCES,\n BLUME_DEAD_LINK: DOCS_CLI_VALIDATE,\n BLUME_DEPENDENCY_MISSING: \"/docs/cli/doctor\",\n BLUME_DUPLICATE_ROUTE: DOCS_CONTENT_NAVIGATION,\n BLUME_DUPLICATE_SIDEBAR_ORDER: DOCS_CONTENT_NAVIGATION,\n BLUME_FRONTMATTER_INVALID: \"/docs/content/frontmatter\",\n BLUME_INCLUDE_CYCLE: DOCS_CONTENT_INCLUDES,\n BLUME_INCLUDE_MALFORMED: DOCS_CONTENT_INCLUDES,\n BLUME_INCLUDE_NOT_FOUND: DOCS_CONTENT_INCLUDES,\n BLUME_INCLUDE_OUTSIDE_ROOT: DOCS_CONTENT_INCLUDES,\n BLUME_MDX_CURLY_ANCHOR: \"/docs/content/syntax\",\n\n BLUME_META_INVALID: \"/docs/content/meta\",\n BLUME_META_LOAD_FAILED: \"/docs/content/meta\",\n BLUME_MISSING_SECRET: DOCS_DEPLOYMENT,\n BLUME_NAV_DUPLICATE_LABEL: DOCS_CONTENT_NAVIGATION,\n BLUME_NAV_HIDDEN_IN_SIDEBAR: DOCS_CONTENT_NAVIGATION,\n BLUME_NAV_INDEX_TITLE_MISMATCH: DOCS_CONTENT_NAVIGATION,\n BLUME_NAV_MISSING_PAGE: DOCS_CONTENT_NAVIGATION,\n BLUME_NODE_VERSION: \"/docs/quickstart\",\n BLUME_SERVER_FEATURE_REQUIRED: DOCS_DEPLOYMENT,\n BLUME_SIDEBAR_DISPLAY_IGNORED: DOCS_CONTENT_NAVIGATION,\n BLUME_SOURCE_FETCH_FAILED: DOCS_CONTENT_SOURCES,\n BLUME_SOURCE_MISCONFIGURED: DOCS_CONTENT_SOURCES,\n BLUME_SOURCE_OFFLINE: DOCS_CONTENT_SOURCES,\n BLUME_SOURCE_SDK_MISSING: DOCS_CONTENT_SOURCES,\n BLUME_SOURCE_UNAVAILABLE: DOCS_CONTENT_SOURCES,\n BLUME_TRANSLATE_MISSING: \"/docs/cli/translate\",\n BLUME_TRANSLATE_STALE: \"/docs/cli/translate\",\n BLUME_UNKNOWN_COMPONENT: \"/docs/configuration/customization\",\n BLUME_UNKNOWN_ICON: DOCS_CONTENT_NAVIGATION,\n BLUME_UNKNOWN_OPTION: \"/docs/cli\",\n BLUME_WIKILINK_AMBIGUOUS: DOCS_CONTENT_SOURCES,\n BLUME_WIKILINK_UNRESOLVED: DOCS_CONTENT_SOURCES,\n BLUME_YARN_PNP: \"/docs/quickstart\",\n })\n);\n\n/** The docs URL that explains a diagnostic code, if one is mapped. */\nexport const resolveDocsUrl = (code: string): string | undefined => {\n const path = DOCS_PATHS.get(code);\n return path ? `${DOCS_BASE}${path}` : undefined;\n};\n\n/** Fill in `docsUrl` from the code map where a diagnostic doesn't set its own. */\nexport const enrichDiagnostic = (diagnostic: Diagnostic): Diagnostic =>\n diagnostic.docsUrl\n ? diagnostic\n : { ...diagnostic, docsUrl: resolveDocsUrl(diagnostic.code) };\n\nconst REGEXP_SPECIAL = /[$()*+.?[\\\\\\]^{|}]/gu;\nconst escapeRegExp = (value: string): string =>\n value.replaceAll(REGEXP_SPECIAL, String.raw`\\$&`);\n\n/** A key segment scans the source text; an array index has no key to find. */\nconst isKeySegment = (segment: string | number): segment is string =>\n typeof segment === \"string\";\n\n/**\n * Where a located value's children are searched. `object` and `array` are the\n * inside of a `{…}`/`[…]` literal, searched entry by entry so a key or an index\n * only matches a direct child. `block` has no brackets — the whole file at the\n * top, or a YAML key's indented lines — and is searched at any depth.\n */\ninterface Scope {\n end: number;\n /** A literal's direct entries (keys or elements), in source order. */\n entries: number[];\n kind: \"array\" | \"block\" | \"object\";\n start: number;\n}\n\n/** A located key or element: where it starts, and where its value starts. */\ninterface Step {\n index: number;\n next: number;\n}\n\nconst QUOTES = new Set(['\"', \"'\", \"`\"]);\nconst OPENERS = new Set([\"(\", \"[\", \"{\"]);\nconst CLOSERS = new Set([\")\", \"]\", \"}\"]);\nconst WHITESPACE = /\\s/u;\n\n/**\n * The index just past a comment starting at `index`, or `index` when none does.\n * A `//` after a `:` is a URL scheme in YAML (`href: https://…`), not a comment.\n */\nconst skipComment = (source: string, index: number): number => {\n if (source.startsWith(\"//\", index) && source.charAt(index - 1) !== \":\") {\n const end = source.indexOf(\"\\n\", index);\n return end === -1 ? source.length : end;\n }\n if (source.startsWith(\"/*\", index)) {\n const end = source.indexOf(\"*/\", index + 2);\n return end === -1 ? source.length : end + 2;\n }\n return index;\n};\n\n/**\n * The index just past a string literal starting at `index`, or `index` when\n * none does. A `'`/`\"` that doesn't close on its own line is an apostrophe in\n * plain YAML text, not a string.\n */\nconst skipString = (source: string, index: number): number => {\n const quote = source.charAt(index);\n if (!QUOTES.has(quote)) {\n return index;\n }\n let cursor = index + 1;\n while (cursor < source.length) {\n const char = source.charAt(cursor);\n if (char === quote) {\n return cursor + 1;\n }\n if (char === \"\\n\" && quote !== \"`\") {\n return index;\n }\n cursor += char === \"\\\\\" ? 2 : 1;\n }\n return index;\n};\n\n/** Where a literal closes, and where each of its direct entries starts. */\ninterface LiteralScan {\n end: number;\n entries: number[];\n}\n\n/**\n * Walk the `{…}`/`[…]` literal opened at `open`: where each direct entry starts\n * (a key, or an array element) and where the literal closes. Nested brackets,\n * strings, and comments are stepped over, so only the literal's own commas\n * separate its entries.\n */\nconst scanLiteral = (source: string, open: number): LiteralScan => {\n const entries: number[] = [];\n let depth = 0;\n let pending = true;\n let index = open + 1;\n while (index < source.length) {\n const afterComment = skipComment(source, index);\n const char = source.charAt(index);\n if (afterComment !== index || WHITESPACE.test(char)) {\n index = Math.max(afterComment, index + 1);\n continue;\n }\n if (depth === 0 && CLOSERS.has(char)) {\n return { end: index, entries };\n }\n if (depth === 0 && pending) {\n entries.push(index);\n pending = false;\n }\n const afterString = skipString(source, index);\n if (afterString !== index) {\n index = afterString;\n continue;\n }\n if (OPENERS.has(char)) {\n depth += 1;\n } else if (CLOSERS.has(char)) {\n depth -= 1;\n } else if (char === \",\" && depth === 0) {\n pending = true;\n }\n index += 1;\n }\n return { end: source.length, entries };\n};\n\n/**\n * The lines indented deeper than the key at `anchor` — a YAML mapping's\n * children — up to the first line that isn't, or `limit`.\n */\nconst indentedBlock = (\n source: string,\n anchor: number,\n limit: number\n): Scope => {\n const column = anchor - (source.lastIndexOf(\"\\n\", anchor - 1) + 1);\n const lineEnd = source.indexOf(\"\\n\", anchor);\n const start = lineEnd === -1 ? limit : Math.min(lineEnd + 1, limit);\n let end = start;\n while (end < limit) {\n const next = source.indexOf(\"\\n\", end);\n const after = next === -1 || next >= limit ? limit : next + 1;\n const line = source.slice(end, after);\n if (line.trim() !== \"\" && line.length - line.trimStart().length <= column) {\n break;\n }\n end = after;\n }\n return { end, entries: [], kind: \"block\", start };\n};\n\n/** A value's lead-in before its literal: spaces, or an adapter call's `vercel(`. */\nconst VALUE_LEAD = /[\\s\\w$.(]*/uy;\n\n/**\n * The scope holding the children of the key or element at `anchor`, whose\n * value starts at `from`. A `{…}`/`[…]` literal — written directly, or as the\n * first argument of a call like `vercel({…})` — is walked entry by entry;\n * anything else falls back to the lines indented under `anchor` (YAML's\n * nesting), within the enclosing scope's `limit`.\n */\nconst valueScope = (source: string, step: Step, limit: number): Scope => {\n VALUE_LEAD.lastIndex = step.next;\n VALUE_LEAD.exec(source);\n const open = VALUE_LEAD.lastIndex;\n const char = source.charAt(open);\n if (open < limit && (char === \"{\" || char === \"[\")) {\n const literal = scanLiteral(source, open);\n return {\n end: literal.end,\n entries: literal.entries,\n kind: char === \"{\" ? \"object\" : \"array\",\n start: open,\n };\n }\n return indentedBlock(source, step.index, limit);\n};\n\n/**\n * Find `segment` as a `key:`/`key =` (bare or quoted) in `scope`: among an\n * object literal's own entries, or anywhere in a block. The negative lookbehind\n * keeps `title` from matching the tail of an unrelated key such as `subtitle:`.\n */\nconst findKey = (\n source: string,\n scope: Scope,\n segment: string\n): Step | undefined => {\n const key = escapeRegExp(segment);\n const pattern = `(?<![\\\\w$])(?:${key}|\"${key}\"|'${key}')\\\\s*[:=]`;\n if (scope.kind === \"block\") {\n const matcher = new RegExp(pattern, \"gu\");\n matcher.lastIndex = scope.start;\n const match = matcher.exec(source);\n return match && match.index < scope.end\n ? { index: match.index, next: matcher.lastIndex }\n : undefined;\n }\n // Sticky: the key must start exactly where the entry does.\n const matcher = new RegExp(pattern, \"uy\");\n for (const entry of scope.kind === \"object\" ? scope.entries : []) {\n matcher.lastIndex = entry;\n if (matcher.test(source)) {\n return { index: entry, next: matcher.lastIndex };\n }\n }\n return undefined;\n};\n\n/** The element at `position` of an array literal; a block can't be indexed. */\nconst findElement = (scope: Scope, position: number): Step | undefined => {\n const index = scope.kind === \"array\" ? scope.entries[position] : undefined;\n return index === undefined ? undefined : { index, next: index };\n};\n\n/**\n * Best-effort source position for a Zod issue path (e.g. `[\"seo\", \"title\"]`,\n * `[\"redirects\", 2, \"status\"]`) in the raw config / frontmatter text. Narrows\n * segment by segment: a key is found among its parent's own entries (or, where\n * there are no brackets, in the parent's indented lines), an index picks that\n * element of an array literal. A segment that isn't there — a missing key —\n * stops the walk at its parent, so the position never escapes into a sibling.\n * Returns 1-based line/column, or undefined when not even the first segment\n * matches.\n */\nconst locatePath = (\n source: string,\n path: readonly (string | number)[]\n): { column: number; line: number } | undefined => {\n let scope: Scope = {\n end: source.length,\n entries: [],\n kind: \"block\",\n start: 0,\n };\n let found = -1;\n for (const segment of path) {\n const step = isKeySegment(segment)\n ? findKey(source, scope, segment)\n : findElement(scope, segment);\n if (!step) {\n break;\n }\n found = step.index;\n scope = valueScope(source, step, scope.end);\n }\n if (found < 0) {\n return;\n }\n const before = source.slice(0, found);\n const lastNewline = before.lastIndexOf(\"\\n\");\n return { column: found - lastNewline, line: before.split(\"\\n\").length };\n};\n\n/** The YAML front matter block of a `.md`/`.mdx` source, if it has one. */\nconst FRONTMATTER = /^---\\r?\\n(?<body>[\\s\\S]*?)\\r?\\n---/u;\n\n/**\n * Locate a front matter key in a content file, e.g. `[\"seo\", \"description\"]` in\n * `docs/api.mdx`. Scoped to the front matter block so a `title:` written in the\n * page body can't be mistaken for the front matter key of the same name; returns\n * undefined when the file has no front matter or the key isn't set (a missing\n * key has no line to point at — callers anchor to the file instead).\n */\nexport const locateFrontmatterKey = (\n source: string,\n path: readonly (string | number)[]\n): { column: number; line: number } | undefined => {\n const block = FRONTMATTER.exec(source);\n if (!block) {\n return;\n }\n // `locatePath` reports lines 1-based within the text it was given, and the\n // front matter body starts one line below the opening `---`.\n const position = locatePath(block.groups?.body ?? \"\", path);\n return position && { column: position.column, line: position.line + 1 };\n};\n\n/**\n * Convert generic validation issues (message + path, the shape shared by Zod\n * and Standard Schema issues) into Blume diagnostics, anchored to a file.\n */\nexport const diagnosticsFromIssues = (\n issues: readonly {\n message: string;\n path: readonly (string | number)[];\n }[],\n options: { code: string; file?: string; source?: string }\n): Diagnostic[] =>\n issues.map((issue) => {\n const schemaPath = issue.path.join(\".\");\n const position = options.source\n ? locatePath(options.source, issue.path)\n : undefined;\n return {\n code: options.code,\n column: position?.column,\n file: options.file,\n line: position?.line,\n message: schemaPath ? `${schemaPath}: ${issue.message}` : issue.message,\n schemaPath: schemaPath || undefined,\n severity: \"error\",\n } satisfies Diagnostic;\n });\n\n/** Convert a ZodError into Blume diagnostics, anchored to a file. */\nexport const diagnosticsFromZod = (\n error: ZodError,\n options: { code: string; file?: string; source?: string }\n): Diagnostic[] =>\n diagnosticsFromIssues(\n error.issues.map((issue) => ({\n message: issue.message,\n // Zod 4 paths are PropertyKey[]; a symbol segment has no place in a\n // dotted schema path or a source-position scan.\n path: issue.path.filter(\n (segment): segment is string | number => typeof segment !== \"symbol\"\n ),\n })),\n options\n );\n\nconst severityColor = (severity: Diagnostic[\"severity\"]) => {\n if (severity === \"error\") {\n return colors.red;\n }\n if (severity === \"warning\") {\n return colors.yellow;\n }\n return colors.blue;\n};\n\n/** Format a single diagnostic for terminal output. */\nexport const formatDiagnostic = (\n diagnostic: Diagnostic,\n root?: string\n): string => {\n const color = severityColor(diagnostic.severity);\n const lines: string[] = [\n `${color(colors.bold(diagnostic.code))} ${diagnostic.message}`,\n ];\n\n // An audit finding is about a built URL, and names the source file that fixes\n // it as a second line (\"at /docs/api\" / \"in docs/api.mdx:3:2\"). Everything\n // else is about a file alone, and keeps the original single `at file` line.\n if (diagnostic.url) {\n lines.push(` ${colors.dim(`at ${diagnostic.url}`)}`);\n }\n if (diagnostic.file) {\n const location = root ? relative(root, diagnostic.file) : diagnostic.file;\n const column =\n diagnostic.column === undefined ? \"\" : `:${diagnostic.column}`;\n const position =\n diagnostic.line === undefined ? \"\" : `:${diagnostic.line}${column}`;\n const label = diagnostic.url ? \"in\" : \"at\";\n lines.push(` ${colors.dim(`${label} ${location}${position}`)}`);\n }\n\n if (diagnostic.suggestion) {\n lines.push(` ${colors.cyan(`fix: ${diagnostic.suggestion}`)}`);\n }\n\n if (diagnostic.docsUrl) {\n lines.push(` ${colors.dim(`docs: ${diagnostic.docsUrl}`)}`);\n }\n\n return lines.join(\"\\n\");\n};\n\nexport const hasErrors = (diagnostics: Diagnostic[]): boolean =>\n diagnostics.some((d) => d.severity === \"error\");\n\nexport const countBySeverity = (diagnostics: Diagnostic[]) => {\n const counts = { error: 0, info: 0, warning: 0 } satisfies Record<\n Diagnostic[\"severity\"],\n number\n >;\n for (const diagnostic of diagnostics) {\n counts[diagnostic.severity] += 1;\n }\n return counts;\n};\n",
13
13
  "import { consola } from \"consola\";\nimport { relative } from \"pathe\";\n\nimport {\n countBySeverity,\n enrichDiagnostic,\n formatDiagnostic,\n hasErrors,\n} from \"../core/diagnostics.ts\";\nimport type { Diagnostic } from \"../core/types.ts\";\n\nexport const logger = consola.withTag(\"blume\");\n\n/**\n * Resolve once stdout has drained. `process.exit` doesn't flush a piped stdout,\n * so await this before exiting non-zero after writing machine-readable output\n * (e.g. `--json`), otherwise the payload can be truncated in CI.\n */\nexport const flushStdout = (): Promise<void> =>\n // oxlint-disable-next-line promise/avoid-new -- adapt stdout's write callback\n new Promise((resolve) => {\n process.stdout.write(\"\", () => resolve());\n });\n\n/**\n * Print diagnostics as a JSON document on stdout for CI and editors: each is\n * enriched with its `docsUrl` and its `file` made root-relative. Returns whether\n * any were errors, matching {@link reportDiagnostics}.\n */\nexport const reportDiagnosticsJson = (\n diagnostics: Diagnostic[],\n root?: string\n): boolean => {\n const enriched = diagnostics.map((diagnostic) => {\n const withDocs = enrichDiagnostic(diagnostic);\n return withDocs.file && root\n ? { ...withDocs, file: relative(root, withDocs.file) }\n : withDocs;\n });\n process.stdout.write(\n `${JSON.stringify(\n { diagnostics: enriched, summary: countBySeverity(diagnostics) },\n null,\n 2\n )}\\n`\n );\n return hasErrors(diagnostics);\n};\n\n/** Print a batch of diagnostics and return whether any were errors. */\nexport const reportDiagnostics = (\n diagnostics: Diagnostic[],\n root?: string\n): boolean => {\n if (diagnostics.length === 0) {\n return false;\n }\n\n for (const diagnostic of diagnostics) {\n process.stderr.write(\n `${formatDiagnostic(enrichDiagnostic(diagnostic), root)}\\n`\n );\n }\n\n const counts = countBySeverity(diagnostics);\n const summary = [\n counts.error ? `${counts.error} error(s)` : null,\n counts.warning ? `${counts.warning} warning(s)` : null,\n ]\n .filter(Boolean)\n .join(\", \");\n if (summary) {\n process.stderr.write(`\\n${summary}\\n`);\n }\n\n return hasErrors(diagnostics);\n};\n",
14
14
  "import type { ArgsDef } from \"citty\";\n\nimport type { Diagnostic } from \"../core/types.ts\";\n\n/** A flag the command doesn't declare, with the declared one it most resembles. */\nexport interface UnknownFlag {\n /** The flag as typed, without any `=value`. */\n flag: string;\n /** The closest declared flag (`--isolated` for `--isolatd`), if one is close. */\n suggestion?: string;\n}\n\n/** What a declared option spelling means for the token that follows it. */\ninterface KnownFlag {\n /** Whether it's a boolean switch, which `--no-<name>` turns off. */\n boolean: boolean;\n /**\n * How the flags a command takes list it: `--kebab-name`, or `--no-<name>`\n * for a boolean that's on by default, since that's the form anyone types.\n */\n display: string;\n /** The canonical kebab-case name, which typos are matched against. */\n name: string;\n /** Whether it reads the next token as its value (`--port 4000`). */\n takesValue: boolean;\n}\n\n/** `budgetJs` → `budget-js`; a name already in kebab case is unchanged. */\nconst kebabCase = (name: string): string =>\n name.replaceAll(/(?<upper>[A-Z])/gu, (letter) => `-${letter.toLowerCase()}`);\n\n/** `budget-js` → `budgetJs`; a name already in camel case is unchanged. */\nconst camelCase = (name: string): string =>\n name.replaceAll(/-(?<letter>[a-z])/gu, (match) =>\n match.slice(1).toUpperCase()\n );\n\nconst aliasesOf = (alias: string | string[] | undefined): string[] => {\n if (alias === undefined) {\n return [];\n }\n return Array.isArray(alias) ? alias : [alias];\n};\n\n/**\n * Every spelling citty accepts for each declared option — the name, its camel\n * and kebab forms, and its aliases — mapped to what that option is. Positional\n * arguments aren't flags and don't appear.\n */\nconst knownFlags = (argsDef: ArgsDef): Map<string, KnownFlag> => {\n const flags = new Map<string, KnownFlag>();\n for (const [name, def] of Object.entries(argsDef)) {\n if (def.type === \"positional\") {\n continue;\n }\n const kebab = kebabCase(name);\n const boolean = def.type === \"boolean\";\n const onByDefault = boolean && \"default\" in def && def.default === true;\n const flag = {\n boolean,\n display: onByDefault ? `--no-${kebab}` : `--${kebab}`,\n name: kebab,\n takesValue: def.type === \"string\" || def.type === \"enum\",\n };\n for (const spelling of [\n name,\n kebabCase(name),\n camelCase(name),\n ...aliasesOf(\"alias\" in def ? def.alias : undefined),\n ]) {\n flags.set(spelling, flag);\n }\n }\n return flags;\n};\n\n/** Edit distance between two short strings (insertions, deletions, swaps of one letter). */\nconst distance = (from: string, to: string): number => {\n let previous = Array.from({ length: to.length + 1 }, (_, index) => index);\n for (const [row, fromChar] of [...from].entries()) {\n const current = [row + 1];\n for (const [column, toChar] of [...to].entries()) {\n current.push(\n Math.min(\n (previous[column + 1] ?? 0) + 1,\n (current[column] ?? 0) + 1,\n (previous[column] ?? 0) + (fromChar === toChar ? 0 : 1)\n )\n );\n }\n previous = current;\n }\n return previous[to.length] ?? 0;\n};\n\n/**\n * The candidate closest to `name`, when it's close enough to be the likely\n * intent: at most two edits away, and fewer edits than half the candidate's\n * length, so a short typo doesn't \"suggest\" an unrelated short word.\n */\nexport const closestMatch = (\n name: string,\n candidates: readonly string[]\n): string | undefined => {\n let best: { candidate: string; edits: number } | undefined;\n for (const candidate of candidates) {\n const edits = distance(name, candidate);\n if (\n edits <= 2 &&\n edits * 2 < candidate.length &&\n (best === undefined || edits < best.edits)\n ) {\n best = { candidate, edits };\n }\n }\n return best?.candidate;\n};\n\n/** A `--name`, `--no-name`, `--name=value`, or `-n` token, taken apart. */\ninterface FlagToken {\n /** Whether it carries its value inline (`--port=4000`). */\n hasValue: boolean;\n /** `--name` rather than `-n`. */\n long: boolean;\n /** The name as typed, without dashes or `=value`. */\n name: string;\n /** The negated flag's name, for a `--no-name` token. */\n negated: string | undefined;\n}\n\nconst parseToken = (arg: string): FlagToken => {\n const long = arg.startsWith(\"--\");\n const [name = \"\"] = arg.slice(long ? 2 : 1).split(\"=\");\n return {\n hasValue: arg.includes(\"=\"),\n long,\n name,\n negated: long && name.startsWith(\"no-\") ? name.slice(3) : undefined,\n };\n};\n\n/**\n * How many tokens after this one a declared flag consumes — one for a string\n * flag's separate value (`--port 4000`, read whatever it looks like, as\n * citty's parser does), none otherwise — or undefined when the token names no\n * declared flag. A negation never reads a value; grouped single-letter\n * booleans (`-ab`) are declared when every letter is.\n */\nconst declaredWidth = (\n token: FlagToken,\n flags: Map<string, KnownFlag>\n): number | undefined => {\n const known =\n flags.get(token.name) ??\n (token.negated === undefined ? undefined : flags.get(token.negated));\n if (known) {\n return known.takesValue && !token.hasValue && token.negated === undefined\n ? 1\n : 0;\n }\n const grouped =\n !token.long &&\n token.name.length > 1 &&\n [...token.name].every((letter) => flags.get(letter)?.takesValue === false);\n return grouped ? 0 : undefined;\n};\n\n/**\n * An undeclared token as reported, with the declared flag it most resembles.\n * A mistyped negation keeps its `no-` in the suggestion (`--no-instal` →\n * `--no-install`), so the fix doesn't flip what was asked for; negating a flag\n * that takes a value means nothing, so those suggest the flag itself.\n */\nconst describeUnknown = (\n token: FlagToken,\n flags: Map<string, KnownFlag>\n): UnknownFlag => {\n const unknown: UnknownFlag = {\n flag: `${token.long ? \"--\" : \"-\"}${token.name}`,\n };\n const names = [...new Set([...flags.values()].map((flag) => flag.name))];\n const match = closestMatch(token.negated ?? token.name, names);\n if (match) {\n const negate = token.negated !== undefined && flags.get(match)?.boolean;\n unknown.suggestion = negate ? `--no-${match}` : `--${match}`;\n }\n return unknown;\n};\n\n/**\n * The flags in `rawArgs` that the command's `args` don't declare. citty itself\n * accepts any flag and drops the ones it doesn't know, so a typo like\n * `--isolatd` would silently run a different command than the one intended.\n *\n * Mirrors what citty accepts: every spelling from {@link knownFlags}, a\n * `--no-<flag>` negation of any of them, `--flag=value`, a declared string\n * flag's separate value token, grouped single-letter boolean aliases, and\n * everything after a bare `--`. `accepted` names extra flags the command\n * handles itself (the removed `blume build --adapter`, which gets its own\n * migration message).\n */\nexport const unknownFlags = (\n rawArgs: readonly string[],\n argsDef: ArgsDef,\n accepted: readonly string[] = []\n): UnknownFlag[] => {\n const flags = knownFlags(argsDef);\n const unknown: UnknownFlag[] = [];\n for (let index = 0; index < rawArgs.length; index += 1) {\n const arg = rawArgs[index] ?? \"\";\n if (arg === \"--\") {\n break;\n }\n if (!arg.startsWith(\"-\") || arg === \"-\") {\n continue;\n }\n const token = parseToken(arg);\n const width = declaredWidth(token, flags);\n if (width !== undefined) {\n index += width;\n } else if (!accepted.includes(token.negated ?? token.name)) {\n unknown.push(describeUnknown(token, flags));\n }\n }\n return unknown;\n};\n\n/**\n * Flags a command reads from its raw arguments itself instead of declaring\n * them, keyed by command name. `blume build` answers the Blume 1 `--adapter`,\n * `--output`, and `--base` with the `deployment` setting that replaced each,\n * which says more than \"unknown option\" would.\n */\nexport const COMMAND_HANDLED_FLAGS = new Map([\n [\"build\", [\"adapter\", \"output\", \"base\"]],\n]);\n\n/**\n * The error for a command run with flags it doesn't declare: each unknown\n * flag (with its likely intended spelling), then every flag the command does\n * take, so the fix is on screen without a trip to `--help`.\n */\nexport const unknownFlagsDiagnostic = (\n command: string,\n unknown: readonly UnknownFlag[],\n argsDef: ArgsDef\n): Diagnostic => {\n const listed = unknown\n .map(({ flag, suggestion }) =>\n suggestion ? `${flag} (did you mean ${suggestion}?)` : flag\n )\n .join(\", \");\n const declared = [\n ...new Set([...knownFlags(argsDef).values()].map((flag) => flag.display)),\n ].toSorted();\n const takes =\n declared.length > 0\n ? `It takes ${declared.join(\", \")}.`\n : \"It takes no options.\";\n return {\n code: \"BLUME_UNKNOWN_OPTION\",\n message: `blume ${command} doesn't know ${unknown.length === 1 ? \"the option\" : \"the options\"} ${listed}.`,\n severity: \"error\",\n suggestion: `${takes} Run \\`blume ${command} --help\\` for what each does.`,\n };\n};\n",
15
15
  "import type { ArgsDef, CommandDef, CommandMeta } from \"citty\";\n\nimport { BlumeError } from \"../core/diagnostics.ts\";\nimport { reportInternalError } from \"./internal-error.ts\";\nimport { reportDiagnostics } from \"./log.ts\";\nimport {\n COMMAND_HANDLED_FLAGS,\n unknownFlags,\n unknownFlagsDiagnostic,\n} from \"./unknown-flags.ts\";\n\n/**\n * Wrap a command so its module is imported only when citty needs its `args`\n * or runs it. `meta` stays static (from `command-meta.ts`), so rendering root\n * usage, matching an unknown name, and `blume <cmd> --help` for *another*\n * command never touch this one's dependency graph.\n *\n * `load` imports the command's module and `key` names its export, so the call\n * site stays a plain `() => import(\"./commands/x.ts\")`.\n *\n * Only `args`, `setup`, `run`, and `cleanup` are forwarded: no Blume command\n * declares `default`, `plugins`, or nested `subCommands`.\n *\n * Two behaviors every command shares live here rather than in each command:\n * `setup` rejects flags the command doesn't declare (citty accepts and drops\n * them, so `blume build --isolatd` would run a real, non-isolated build), and\n * `run` reports a {@link BlumeError} a command lets escape — a config that\n * fails validation, say — as its diagnostic instead of citty's raw stack dump.\n */\nexport const lazyCommand = <Args extends ArgsDef, Key extends string>(\n meta: CommandMeta,\n load: () => Promise<Record<Key, CommandDef<Args>>>,\n key: Key\n): CommandDef<Args> => {\n const command = async () => {\n const module = await load();\n return module[key];\n };\n const name = meta.name ?? key;\n return {\n args: async () => {\n const { args } = await command();\n // SAFETY: every Blume command passes `args` to `defineCommand` as a plain\n // object literal (the \"command registry\" test checks it); citty's\n // `Resolvable` widening is the only reason the type also admits a thunk\n // or a promise here.\n return args as Args;\n },\n cleanup: async (context) => {\n const loaded = await command();\n await loaded.cleanup?.(context);\n },\n meta,\n run: async (context) => {\n const loaded = await command();\n try {\n await loaded.run?.(context);\n } catch (error) {\n if (error instanceof BlumeError) {\n reportDiagnostics([error.diagnostic], process.cwd());\n } else {\n reportInternalError(error);\n }\n process.exit(1);\n }\n },\n setup: async (context) => {\n const loaded = await command();\n // SAFETY: as for `args` above, every command's `args` is a plain object.\n const argsDef = (loaded.args ?? {}) as ArgsDef;\n const unknown = unknownFlags(\n context.rawArgs,\n argsDef,\n COMMAND_HANDLED_FLAGS.get(name)\n );\n if (unknown.length > 0) {\n reportDiagnostics([unknownFlagsDiagnostic(name, unknown, argsDef)]);\n process.exit(1);\n }\n await loaded.setup?.(context);\n },\n };\n};\n"
16
16
  ],
17
- "mappings": "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",
18
- "debugId": "3B8E364FC63CDED364756E2164756E21",
17
+ "mappings": "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",
18
+ "debugId": "FDC6644211D8A03B64756E2164756E21",
19
19
  "names": []
20
20
  }
@@ -0,0 +1,32 @@
1
+ import type { BlumeProject } from "../core/project-graph.ts";
2
+ import type { ResolvedConfig } from "../core/schema.ts";
3
+ /**
4
+ * What a build actually serves of the agent surfaces whose config flag alone
5
+ * doesn't guarantee them.
6
+ */
7
+ export interface EmittedAgentSurface {
8
+ /** The MCP server was generated (see {@link servesMcp}). */
9
+ mcp: boolean;
10
+ /**
11
+ * A skills discovery index is served: generated from `agents.skills` (at
12
+ * least one valid skill), or shipped by the user in `public/`.
13
+ */
14
+ skills: boolean;
15
+ }
16
+ /**
17
+ * Whether the build generates the MCP server: it is enabled and no content
18
+ * or custom page owns its route. When one does, the generator skips the
19
+ * server with a warning rather than collide with the page (`planMcp`).
20
+ */
21
+ export declare const servesMcp: (project: BlumeProject, userPages: {
22
+ pattern: string;
23
+ }[]) => boolean;
24
+ /**
25
+ * The config the discovery documents are built from: `agents.mcp` and
26
+ * `agents.skills` switched off when the build didn't emit them, so llms.txt,
27
+ * agent-readability.json, the catalogs, and the header rules only point at
28
+ * what is there. A config flag says what was asked for; the MCP server is
29
+ * skipped when a page owns its route, and skills publish nothing when their
30
+ * directory is missing or holds no valid skill.
31
+ */
32
+ export declare const advertisedConfig: (config: ResolvedConfig, emitted: EmittedAgentSurface) => ResolvedConfig;
@@ -11,7 +11,13 @@ import type { ResolvedConfig } from "../core/schema.ts";
11
11
  * entry too, described by its generated `/openapi.json`.
12
12
  */
13
13
  export declare const API_CATALOG_PATH = "/.well-known/api-catalog";
14
- export declare const API_CATALOG_TYPE = "application/linkset+json";
14
+ /** The profile URI RFC 9727 registers for an API catalog linkset. */
15
+ export declare const API_CATALOG_PROFILE = "https://www.rfc-editor.org/info/rfc9727";
16
+ /**
17
+ * The catalog's media type: a linkset carrying the RFC 9727 profile
18
+ * parameter, which the RFC says an API catalog SHOULD be served with.
19
+ */
20
+ export declare const API_CATALOG_TYPE = "application/linkset+json; profile=\"https://www.rfc-editor.org/info/rfc9727\"";
15
21
  /** Whether the site has anything to catalog — gates every emission surface. */
16
22
  export declare const hasApiCatalog: (config: ResolvedConfig) => boolean;
17
23
  /** The `application/linkset+json` document, or null when there are no APIs. */
@@ -23,6 +23,13 @@ export interface AskData {
23
23
  defaultLocale?: string;
24
24
  documents: OramaDoc[];
25
25
  site: string | null;
26
+ /**
27
+ * Present on a versioned site, whose documents then carry their `version`
28
+ * (`""` for the current docs): retrieval keeps to the version the reader
29
+ * is viewing — the current docs unless they're on an archived page — as
30
+ * the search dialog does.
31
+ */
32
+ versioned?: boolean;
26
33
  }
27
34
  /**
28
35
  * How much retrieved documentation a question carries (the `ai.assistant.retrieval`
@@ -149,10 +149,10 @@ export declare const downlevelComponentNode: (node: MdastNode, walk: DownlevelWa
149
149
  * over the built-ins: a same-name entry replaces the built-in serializer, and
150
150
  * one that always returns `null` effectively opts that component out.
151
151
  *
152
- * `frontmatter` is the page's parsed front-matter data. It is put in scope
153
- * when evaluating attribute expressions — so `prop={frontmatter.status}`
154
- * resolves the way it does when Astro renders the page — and handed to
155
- * serializers on their context.
152
+ * `frontmatter` is the page's parsed front-matter data. Attribute
153
+ * expressions that reference it — `prop={frontmatter.status}` — resolve the
154
+ * way they do when Astro renders the page, and it is handed to serializers on
155
+ * their context. Expressions are read as literal data, never executed.
156
156
  */
157
157
  export declare const downlevelComponents: (source: string, components?: Record<string, ComponentMarkdown>, frontmatter?: Record<string, EvaluatedValue>) => string;
158
158
  export {};
@@ -1,14 +1,19 @@
1
1
  import type { BlumeProject } from "../core/project-graph.ts";
2
2
  /**
3
- * Relative page links on the agent surfaces — the `.md`/`.mdx` mirrors,
3
+ * Page links on the agent surfaces — the `.md`/`.mdx` mirrors,
4
4
  * llms-full.txt, MCP `get_page` and `resources/read`. An agent resolves
5
5
  * `[Install](./install)` against the URL it fetched (`/guides.md`), so the
6
6
  * link lands on `/install`; the rendered page rewrites it to the route it
7
7
  * means (`markdown/relative-links.ts`), and the Markdown an agent reads gets
8
8
  * the same rewrite from the same resolver (`resolveRelativeHref`), so both
9
- * point at one page. Inline links and reference definitions are rewritten;
10
- * fenced and inline code, images, and anything not a relative page link are
11
- * left as written.
9
+ * point at one page. Root-relative page links (`[x](/guide)`,
10
+ * `<Card href="/guide">`) get what the rendered page gives them too: the
11
+ * `deployment.base` + `basePath` prefix (`markdown/base-links.ts`,
12
+ * `components/content/base-href.ts`) and, on a page in a prefixed locale,
13
+ * that locale's copy of the route when it is served
14
+ * (`components/layout/LocaleLinks.astro`). Inline links, component `href`s,
15
+ * and reference definitions are rewritten; fenced and inline code, images,
16
+ * asset links, and external URLs are left as written.
12
17
  */
13
18
  /** The page a Markdown text was written for. */
14
19
  export interface LinkedPage {
@@ -0,0 +1,28 @@
1
+ import type { EvaluatedValue } from "./component-markdown.ts";
2
+ /**
3
+ * Read an MDX attribute expression (`prop={...}`) as literal data, without
4
+ * running it. The agent Markdown downleveler converts components on every
5
+ * page it is handed — plain `.md` pages Astro never executes, and content a
6
+ * CMS or a release feed supplies — so an expression is parsed, never
7
+ * evaluated: only data a reader could see by looking at it is recovered.
8
+ *
9
+ * Accepted: string, number, boolean, `null`, and `undefined` literals; array
10
+ * and object literals, nested; unary minus on a number; template literals
11
+ * whose substitutions are themselves accepted; and `frontmatter.<path>`
12
+ * member access (dot steps, or bracketed string and number literals),
13
+ * resolved against the page's front matter the way `prop={frontmatter.status}`
14
+ * resolves when Astro renders the page. Comments are skipped. Anything else —
15
+ * a call, an operator, a spread, a shorthand property, any other name — is
16
+ * not static, and the caller keeps the component's JSX as written.
17
+ */
18
+ /** The outcome of reading an expression: its value, or `ok: false`. */
19
+ export interface StaticExpressionResult {
20
+ ok: boolean;
21
+ value: EvaluatedValue;
22
+ }
23
+ /**
24
+ * Read `raw` — an attribute expression's source — as static data, with
25
+ * `frontmatter` (the page's front matter, when the caller has it) behind
26
+ * `frontmatter.<path>` references. Never executes anything.
27
+ */
28
+ export declare const readStaticExpression: (raw: string, frontmatter?: Record<string, EvaluatedValue>) => StaticExpressionResult;