blume 1.7.2 → 2.0.0

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 (677) hide show
  1. package/AGENTS.md +19 -0
  2. package/CHANGELOG.md +227 -0
  3. package/README.md +34 -21
  4. package/dist/cli/chunk-11j0384y.js +148 -0
  5. package/dist/cli/chunk-11j0384y.js.map +10 -0
  6. package/dist/cli/{chunk-xhtpx3ff.js → chunk-1w8dp3qb.js} +17 -16
  7. package/dist/cli/{chunk-xhtpx3ff.js.map → chunk-1w8dp3qb.js.map} +3 -3
  8. package/dist/cli/chunk-2q1dwty4.js +75 -0
  9. package/dist/cli/chunk-2q1dwty4.js.map +11 -0
  10. package/dist/cli/chunk-41za066z.js +122 -0
  11. package/dist/cli/chunk-41za066z.js.map +11 -0
  12. package/dist/cli/chunk-5a2z0198.js +133 -0
  13. package/dist/cli/chunk-5a2z0198.js.map +10 -0
  14. package/dist/cli/{chunk-9he6crym.js → chunk-6k8vp3ta.js} +25 -13
  15. package/dist/cli/{chunk-9he6crym.js.map → chunk-6k8vp3ta.js.map} +4 -4
  16. package/dist/cli/{chunk-mt76t7dj.js → chunk-79njf86q.js} +133 -54
  17. package/dist/cli/chunk-79njf86q.js.map +11 -0
  18. package/dist/cli/{chunk-3w7b2vcx.js → chunk-7ez8ny0t.js} +2 -2
  19. package/dist/cli/{chunk-688e0dde.js → chunk-88cpgt6h.js} +1 -1
  20. package/dist/cli/chunk-a9kptbw5.js +361 -0
  21. package/dist/cli/chunk-a9kptbw5.js.map +14 -0
  22. package/dist/cli/chunk-abh8yjkn.js +31 -0
  23. package/dist/cli/chunk-abh8yjkn.js.map +10 -0
  24. package/dist/cli/chunk-b5aj94ah.js +91 -0
  25. package/dist/cli/chunk-b5aj94ah.js.map +10 -0
  26. package/dist/cli/{chunk-hs3gbh8p.js → chunk-bctazmbk.js} +9 -5
  27. package/dist/cli/chunk-bctazmbk.js.map +10 -0
  28. package/dist/cli/chunk-beat36xx.js +279 -0
  29. package/dist/cli/chunk-beat36xx.js.map +10 -0
  30. package/dist/cli/chunk-bnbmcwfb.js +145 -0
  31. package/dist/cli/chunk-bnbmcwfb.js.map +11 -0
  32. package/dist/cli/{chunk-9bkjd11x.js → chunk-bw22s759.js} +15 -5
  33. package/dist/cli/{chunk-9bkjd11x.js.map → chunk-bw22s759.js.map} +4 -4
  34. package/dist/cli/chunk-by2290sx.js +39 -0
  35. package/dist/cli/chunk-by2290sx.js.map +10 -0
  36. package/dist/cli/chunk-d1tadaw7.js +79 -0
  37. package/dist/cli/chunk-d1tadaw7.js.map +10 -0
  38. package/dist/cli/{chunk-t3tj0dgr.js → chunk-d80hr03s.js} +24 -19
  39. package/dist/cli/chunk-d80hr03s.js.map +15 -0
  40. package/dist/cli/chunk-ernrthtr.js +97 -0
  41. package/dist/cli/chunk-ernrthtr.js.map +10 -0
  42. package/dist/cli/chunk-f2972sbt.js +374 -0
  43. package/dist/cli/chunk-f2972sbt.js.map +10 -0
  44. package/dist/cli/{chunk-exeeb35e.js → chunk-f7t03s3g.js} +2 -2
  45. package/dist/cli/{chunk-2z47ypj8.js → chunk-fa25z98p.js} +16 -3
  46. package/dist/cli/chunk-fa25z98p.js.map +11 -0
  47. package/dist/cli/{chunk-12dxjqk7.js → chunk-fh5hj5jt.js} +44 -21
  48. package/dist/cli/chunk-fh5hj5jt.js.map +10 -0
  49. package/dist/cli/{chunk-8cd8tj54.js → chunk-j8mw0za6.js} +86 -57
  50. package/dist/cli/chunk-j8mw0za6.js.map +35 -0
  51. package/dist/cli/chunk-jts8mvcz.js +106 -0
  52. package/dist/cli/{chunk-2mzebbbz.js.map → chunk-jts8mvcz.js.map} +6 -4
  53. package/dist/cli/{chunk-ejjx8znq.js → chunk-mnqj32sj.js} +505 -536
  54. package/dist/cli/chunk-mnqj32sj.js.map +12 -0
  55. package/dist/cli/{chunk-196vjxp9.js → chunk-mwt1k8n7.js} +100 -372
  56. package/dist/cli/chunk-mwt1k8n7.js.map +10 -0
  57. package/dist/cli/chunk-nk3ts2xk.js +51 -0
  58. package/dist/cli/chunk-nk3ts2xk.js.map +10 -0
  59. package/dist/cli/{chunk-n9sra6sy.js → chunk-pat2zzwc.js} +10 -14
  60. package/dist/cli/{chunk-n9sra6sy.js.map → chunk-pat2zzwc.js.map} +2 -2
  61. package/dist/cli/chunk-pnnvybbk.js +176 -0
  62. package/dist/cli/chunk-pnnvybbk.js.map +11 -0
  63. package/dist/cli/{chunk-cvky9gb2.js → chunk-sqn5t4q0.js} +81 -87
  64. package/dist/cli/chunk-sqn5t4q0.js.map +10 -0
  65. package/dist/cli/{chunk-eevwt1sc.js → chunk-tzne8qfq.js} +15 -15
  66. package/dist/cli/{chunk-eevwt1sc.js.map → chunk-tzne8qfq.js.map} +1 -1
  67. package/dist/cli/chunk-xaz13gwg.js +12449 -0
  68. package/dist/cli/chunk-xaz13gwg.js.map +182 -0
  69. package/dist/cli/chunk-y3e45rc8.js +102 -0
  70. package/dist/cli/chunk-y3e45rc8.js.map +10 -0
  71. package/dist/cli/chunk-z01ze5c1.js +261 -0
  72. package/dist/cli/chunk-z01ze5c1.js.map +10 -0
  73. package/dist/cli/{chunk-5n7t497w.js → chunk-z1f5arsg.js} +247 -755
  74. package/dist/cli/chunk-z1f5arsg.js.map +36 -0
  75. package/dist/cli/{chunk-hdm2dkd2.js → chunk-zg2gtj10.js} +1086 -2596
  76. package/dist/cli/chunk-zg2gtj10.js.map +35 -0
  77. package/dist/cli/{chunk-ppfvdcd4.js → chunk-zxccj738.js} +1 -1
  78. package/dist/cli/index.js +214 -57
  79. package/dist/cli/index.js.map +8 -7
  80. package/dist/types/ai/agent-readability.d.ts +52 -0
  81. package/dist/types/ai/ai-catalog.d.ts +42 -0
  82. package/dist/types/ai/api/paths.d.ts +17 -0
  83. package/dist/types/ai/api-catalog.d.ts +18 -0
  84. package/dist/types/ai/ask.d.ts +368 -0
  85. package/dist/types/ai/changelog-markdown.d.ts +2 -0
  86. package/dist/types/ai/component-markdown.d.ts +2 -2
  87. package/dist/types/ai/index.d.ts +24 -0
  88. package/dist/types/ai/link-headers.d.ts +24 -0
  89. package/dist/types/ai/llms.d.ts +25 -0
  90. package/dist/types/ai/markdown.d.ts +45 -0
  91. package/dist/types/ai/mcp/discovery.d.ts +68 -0
  92. package/dist/types/ai/mcp/tools.d.ts +16 -0
  93. package/dist/types/ai/openapi-components.d.ts +43 -0
  94. package/dist/types/ai/relative-links.d.ts +26 -0
  95. package/dist/types/ai/serializers.d.ts +15 -0
  96. package/dist/types/ai/skills.d.ts +42 -0
  97. package/dist/types/ai/tar.d.ts +25 -0
  98. package/dist/types/ai/visibility.d.ts +17 -0
  99. package/dist/types/ai/web-bot-auth.d.ts +16 -0
  100. package/dist/types/analytics/adobe.d.ts +35 -0
  101. package/dist/types/analytics/amplitude.d.ts +50 -0
  102. package/dist/types/analytics/clarity.d.ts +31 -0
  103. package/dist/types/analytics/clearbit.d.ts +29 -0
  104. package/dist/types/analytics/cloudflare.d.ts +41 -0
  105. package/dist/types/analytics/fathom.d.ts +41 -0
  106. package/dist/types/analytics/google-analytics.d.ts +44 -0
  107. package/dist/types/analytics/google-tag-manager.d.ts +40 -0
  108. package/dist/types/analytics/head.d.ts +30 -0
  109. package/dist/types/analytics/heap.d.ts +40 -0
  110. package/dist/types/analytics/hightouch.d.ts +44 -0
  111. package/dist/types/analytics/hotjar.d.ts +33 -0
  112. package/dist/types/analytics/index.d.ts +61 -0
  113. package/dist/types/analytics/inline.d.ts +17 -0
  114. package/dist/types/analytics/logrocket.d.ts +44 -0
  115. package/dist/types/analytics/mixpanel.d.ts +67 -0
  116. package/dist/types/analytics/pirsch.d.ts +42 -0
  117. package/dist/types/analytics/plausible.d.ts +56 -0
  118. package/dist/types/analytics/posthog.d.ts +45 -0
  119. package/dist/types/analytics/schema.d.ts +320 -0
  120. package/dist/types/analytics/script.d.ts +46 -0
  121. package/dist/types/analytics/segment.d.ts +50 -0
  122. package/dist/types/analytics/vercel.d.ts +48 -0
  123. package/dist/types/astro/integration.d.ts +76 -0
  124. package/dist/types/astro/markdown-negotiation.d.ts +23 -0
  125. package/dist/types/astro/module-types.d.ts +14 -0
  126. package/dist/types/astro/pages.d.ts +44 -0
  127. package/dist/types/cli/env.d.ts +12 -0
  128. package/dist/types/cli/init/scaffold.d.ts +154 -0
  129. package/dist/types/components/layout/nav-utils.d.ts +11 -0
  130. package/dist/types/core/adapter.d.ts +47 -0
  131. package/dist/types/core/api-name.d.ts +7 -0
  132. package/dist/types/core/changelog-index.d.ts +13 -0
  133. package/dist/types/core/config-input.d.ts +209 -505
  134. package/dist/types/core/config.d.ts +60 -34
  135. package/dist/types/core/content-assets.d.ts +76 -0
  136. package/dist/types/core/custom-pages.d.ts +33 -0
  137. package/dist/types/core/data.d.ts +28 -11
  138. package/dist/types/core/define-components.d.ts +12 -9
  139. package/dist/types/core/deployment-env.d.ts +6 -11
  140. package/dist/types/core/frontmatter.d.ts +10 -0
  141. package/dist/types/core/graph.d.ts +18 -0
  142. package/dist/types/core/heading-markers.d.ts +54 -0
  143. package/dist/types/core/i18n-ui.d.ts +6 -2
  144. package/dist/types/core/i18n.d.ts +87 -0
  145. package/dist/types/core/includes.d.ts +138 -0
  146. package/dist/types/core/last-modified.d.ts +47 -0
  147. package/dist/types/core/links.d.ts +95 -0
  148. package/dist/types/core/locale-links.d.ts +60 -0
  149. package/dist/types/core/manifest.d.ts +17 -0
  150. package/dist/types/core/meta.d.ts +38 -0
  151. package/dist/types/core/nav-diagnostics.d.ts +26 -0
  152. package/dist/types/core/navigation.d.ts +6 -0
  153. package/dist/types/core/node-require.d.ts +19 -0
  154. package/dist/types/core/package-json.d.ts +13 -0
  155. package/dist/types/core/probe.d.ts +42 -0
  156. package/dist/types/core/project-graph.d.ts +51 -0
  157. package/dist/types/core/project.d.ts +2 -0
  158. package/dist/types/core/safe-href.d.ts +2 -0
  159. package/dist/types/core/safe-links.d.ts +26 -0
  160. package/dist/types/core/schema.d.ts +2291 -441
  161. package/dist/types/core/site-url.d.ts +16 -0
  162. package/dist/types/core/sources/assets.d.ts +36 -0
  163. package/dist/types/core/sources/cache.d.ts +37 -0
  164. package/dist/types/core/sources/collection.d.ts +28 -0
  165. package/dist/types/core/sources/contentful-rich-text.d.ts +31 -0
  166. package/dist/types/core/sources/contentful.d.ts +40 -0
  167. package/dist/types/core/sources/filesystem.d.ts +24 -0
  168. package/dist/types/core/sources/github-releases.d.ts +31 -0
  169. package/dist/types/core/sources/json.d.ts +30 -0
  170. package/dist/types/core/sources/lexical.d.ts +19 -0
  171. package/dist/types/core/sources/lower.d.ts +75 -0
  172. package/dist/types/core/sources/mdx-remote.d.ts +28 -0
  173. package/dist/types/core/sources/normalize.d.ts +147 -0
  174. package/dist/types/core/sources/notion.d.ts +131 -0
  175. package/dist/types/core/sources/obsidian.d.ts +46 -0
  176. package/dist/types/core/sources/payload.d.ts +39 -0
  177. package/dist/types/core/sources/portable-text.d.ts +42 -0
  178. package/dist/types/core/sources/read.d.ts +23 -0
  179. package/dist/types/core/sources/remote.d.ts +74 -0
  180. package/dist/types/core/sources/resolve.d.ts +19 -0
  181. package/dist/types/core/sources/sanity.d.ts +43 -0
  182. package/dist/types/core/sources/strapi-blocks.d.ts +12 -0
  183. package/dist/types/core/sources/strapi.d.ts +33 -0
  184. package/dist/types/core/sources/types.d.ts +7 -0
  185. package/dist/types/core/sources/watch.d.ts +45 -0
  186. package/dist/types/core/text-width.d.ts +11 -0
  187. package/dist/types/core/types.d.ts +20 -1
  188. package/dist/types/core/unrecognized-keys.d.ts +7 -0
  189. package/dist/types/core/versions.d.ts +72 -0
  190. package/dist/types/core/yaml.d.ts +9 -0
  191. package/dist/types/deploy/adapter-output.d.ts +45 -0
  192. package/dist/types/deploy/adapters/cloudflare.d.ts +40 -0
  193. package/dist/types/deploy/adapters/index.d.ts +29 -0
  194. package/dist/types/deploy/adapters/netlify.d.ts +37 -0
  195. package/dist/types/deploy/adapters/node.d.ts +37 -0
  196. package/dist/types/deploy/adapters/registry.d.ts +133 -0
  197. package/dist/types/deploy/adapters/types.d.ts +71 -0
  198. package/dist/types/deploy/adapters/vercel.d.ts +38 -0
  199. package/dist/types/deploy/artifacts.d.ts +65 -0
  200. package/dist/types/deploy/cloudflare-negotiation.d.ts +196 -0
  201. package/dist/types/deploy/function-bundle.d.ts +80 -0
  202. package/dist/types/deploy/headers.d.ts +50 -0
  203. package/dist/types/deploy/node-headers.d.ts +42 -0
  204. package/dist/types/deploy/platforms/cloudflare.d.ts +40 -0
  205. package/dist/types/deploy/platforms/index.d.ts +18 -0
  206. package/dist/types/deploy/platforms/netlify.d.ts +13 -0
  207. package/dist/types/deploy/platforms/node.d.ts +11 -0
  208. package/dist/types/deploy/platforms/paths.d.ts +27 -0
  209. package/dist/types/deploy/platforms/static.d.ts +10 -0
  210. package/dist/types/deploy/platforms/types.d.ts +104 -0
  211. package/dist/types/deploy/platforms/vercel.d.ts +32 -0
  212. package/dist/types/deploy/redirects.d.ts +53 -0
  213. package/dist/types/deploy/robots.d.ts +8 -0
  214. package/dist/types/deploy/rss.d.ts +31 -0
  215. package/dist/types/deploy/sitemap.d.ts +21 -0
  216. package/dist/types/deploy/vercel-negotiation.d.ts +109 -0
  217. package/dist/types/markdown/code-title.d.ts +32 -0
  218. package/dist/types/markdown/fence-meta.d.ts +23 -0
  219. package/dist/types/markdown/themes.d.ts +3 -3
  220. package/dist/types/openapi/asyncapi.d.ts +129 -0
  221. package/dist/types/openapi/graphql-build.d.ts +8 -0
  222. package/dist/types/openapi/graphql.d.ts +122 -0
  223. package/dist/types/openapi/model.d.ts +158 -0
  224. package/dist/types/openapi/parse.d.ts +57 -0
  225. package/dist/types/openapi/references.d.ts +37 -25
  226. package/dist/types/openapi/render-mdx.d.ts +33 -0
  227. package/dist/types/openapi/sentence.d.ts +7 -0
  228. package/dist/types/openapi/signature.d.ts +10 -0
  229. package/dist/types/openapi/source.d.ts +22 -0
  230. package/dist/types/openapi/spec-dependency-error.d.ts +10 -0
  231. package/dist/types/reference/asyncapi.d.ts +166 -0
  232. package/dist/types/reference/graphql.d.ts +181 -0
  233. package/dist/types/reference/index.d.ts +32 -0
  234. package/dist/types/reference/openapi.d.ts +165 -0
  235. package/dist/types/reference/options.d.ts +157 -0
  236. package/dist/types/reference/scalar.d.ts +136 -0
  237. package/dist/types/reference/schema.d.ts +630 -0
  238. package/dist/types/search/adapters/algolia.d.ts +32 -0
  239. package/dist/types/search/adapters/flexsearch.d.ts +12 -0
  240. package/dist/types/search/adapters/index.d.ts +31 -0
  241. package/dist/types/search/adapters/mixedbread.d.ts +22 -0
  242. package/dist/types/search/adapters/orama-cloud.d.ts +33 -0
  243. package/dist/types/search/adapters/orama.d.ts +13 -0
  244. package/dist/types/search/adapters/pagefind.d.ts +12 -0
  245. package/dist/types/search/adapters/registry.d.ts +228 -0
  246. package/dist/types/search/adapters/types.d.ts +34 -0
  247. package/dist/types/search/adapters/typesense.d.ts +42 -0
  248. package/dist/types/search/build.d.ts +23 -0
  249. package/dist/types/search/documents.d.ts +90 -0
  250. package/dist/types/search/facets.d.ts +3 -0
  251. package/dist/types/search/sync/algolia.d.ts +14 -0
  252. package/dist/types/search/sync/index.d.ts +14 -0
  253. package/dist/types/search/sync/orama-cloud.d.ts +10 -0
  254. package/dist/types/search/sync/typesense.d.ts +14 -0
  255. package/dist/types/sources/contentful.d.ts +68 -0
  256. package/dist/types/sources/custom.d.ts +20 -0
  257. package/dist/types/sources/filesystem.d.ts +42 -0
  258. package/dist/types/sources/github-releases.d.ts +46 -0
  259. package/dist/types/sources/index.d.ts +48 -0
  260. package/dist/types/sources/mdx-remote.d.ts +63 -0
  261. package/dist/types/sources/notion.d.ts +65 -0
  262. package/dist/types/sources/obsidian.d.ts +34 -0
  263. package/dist/types/sources/payload.d.ts +68 -0
  264. package/dist/types/sources/registry.d.ts +1414 -0
  265. package/dist/types/sources/sanity.d.ts +69 -0
  266. package/dist/types/sources/shared.d.ts +46 -0
  267. package/dist/types/sources/strapi.d.ts +66 -0
  268. package/dist/types/theme/icon-kind.d.ts +11 -0
  269. package/dist/types/theme/icons.d.ts +20 -0
  270. package/docs/01-quickstart.mdx +18 -18
  271. package/docs/02-deployment.mdx +50 -26
  272. package/docs/03-upgrading.mdx +351 -0
  273. package/docs/04-migrating.mdx +58 -0
  274. package/docs/08-faq.mdx +3 -3
  275. package/docs/advanced/blog.mdx +13 -6
  276. package/docs/advanced/changelog.mdx +23 -35
  277. package/docs/advanced/custom-pages.mdx +20 -8
  278. package/docs/advanced/meta.ts +1 -8
  279. package/docs/advanced/skills.mdx +8 -0
  280. package/docs/cli/audit.mdx +646 -0
  281. package/docs/cli/doctor.mdx +29 -0
  282. package/docs/{reference/eval.mdx → cli/evals.mdx} +9 -8
  283. package/docs/cli/index.mdx +105 -0
  284. package/docs/cli/meta.ts +7 -0
  285. package/docs/{reference → cli}/translate.mdx +1 -1
  286. package/docs/cli/validate.mdx +41 -0
  287. package/docs/cli/version.mdx +40 -0
  288. package/docs/configuration/analytics.mdx +350 -59
  289. package/docs/configuration/ask-ai.mdx +176 -61
  290. package/docs/configuration/customization.mdx +15 -9
  291. package/docs/configuration/index.mdx +52 -31
  292. package/docs/configuration/search.mdx +75 -54
  293. package/docs/configuration/theming.mdx +24 -15
  294. package/docs/content/components.mdx +21 -5
  295. package/docs/{reference → content}/frontmatter.mdx +37 -1
  296. package/docs/content/i18n.mdx +8 -6
  297. package/docs/content/includes.mdx +2 -4
  298. package/docs/content/index.mdx +1 -1
  299. package/docs/content/islands.mdx +10 -5
  300. package/docs/content/meta.mdx +1 -1
  301. package/docs/content/meta.ts +1 -0
  302. package/docs/content/navigation.mdx +12 -7
  303. package/docs/content/sources.mdx +145 -50
  304. package/docs/content/syntax.mdx +26 -12
  305. package/docs/content/versioning.mdx +3 -3
  306. package/docs/discoverability/agent-discovery.mdx +91 -10
  307. package/docs/discoverability/index.mdx +5 -5
  308. package/docs/discoverability/json-api.mdx +4 -4
  309. package/docs/discoverability/llms-txt.mdx +6 -6
  310. package/docs/discoverability/markdown.mdx +4 -4
  311. package/docs/discoverability/mcp.mdx +11 -11
  312. package/docs/discoverability/sitemap-and-robots.mdx +3 -3
  313. package/docs/index.mdx +2 -2
  314. package/docs/references/asyncapi.mdx +59 -0
  315. package/docs/{advanced → references}/graphql.mdx +45 -32
  316. package/docs/{reference → references}/meta.ts +2 -2
  317. package/docs/references/openapi.mdx +171 -0
  318. package/docs/references/scalar.mdx +64 -0
  319. package/package.json +42 -8
  320. package/skills/blume/SKILL.md +21 -8
  321. package/skills/blume-migrate/SKILL.md +22 -21
  322. package/skills/blume-migrate/assets/oxfmt@0.67.0.patch +49 -0
  323. package/skills/blume-migrate/references/docusaurus.md +5 -4
  324. package/skills/blume-migrate/references/fumadocs.md +4 -4
  325. package/skills/blume-migrate/references/mintlify.md +23 -8
  326. package/skills/blume-migrate/references/monorepo.md +6 -6
  327. package/skills/blume-migrate/references/starlight.md +4 -4
  328. package/src/ai/agent-readability.ts +26 -22
  329. package/src/ai/ai-catalog.ts +259 -0
  330. package/src/ai/api/handlers.ts +46 -11
  331. package/src/ai/api-catalog.ts +8 -8
  332. package/src/ai/ask-data.ts +1 -1
  333. package/src/ai/ask.ts +624 -100
  334. package/src/ai/changelog-markdown.ts +91 -0
  335. package/src/ai/component-markdown.ts +328 -12
  336. package/src/ai/index.ts +45 -0
  337. package/src/ai/link-headers.ts +19 -6
  338. package/src/ai/llms.ts +26 -15
  339. package/src/ai/markdown.ts +35 -5
  340. package/src/ai/mcp/data.ts +9 -5
  341. package/src/ai/mcp/discovery.ts +1 -1
  342. package/src/ai/openapi-components.ts +4 -1
  343. package/src/ai/relative-links.ts +170 -0
  344. package/src/ai/serializers.ts +2 -2
  345. package/src/ai/skills.ts +1 -1
  346. package/src/ai/web-bot-auth.ts +2 -2
  347. package/src/analytics/adobe.ts +46 -0
  348. package/src/analytics/amplitude.ts +79 -0
  349. package/src/analytics/clarity.ts +46 -0
  350. package/src/analytics/clearbit.ts +47 -0
  351. package/src/analytics/cloudflare.ts +67 -0
  352. package/src/analytics/fathom.ts +64 -0
  353. package/src/analytics/google-analytics.ts +84 -0
  354. package/src/analytics/google-tag-manager.ts +61 -0
  355. package/src/analytics/head.ts +130 -0
  356. package/src/analytics/heap.ts +65 -0
  357. package/src/analytics/hightouch.ts +77 -0
  358. package/src/analytics/hotjar.ts +47 -0
  359. package/src/analytics/index.ts +71 -0
  360. package/src/analytics/inline.ts +21 -0
  361. package/src/analytics/logrocket.ts +71 -0
  362. package/src/analytics/mixpanel.ts +92 -0
  363. package/src/analytics/pirsch.ts +66 -0
  364. package/src/analytics/plausible.ts +83 -0
  365. package/src/analytics/posthog.ts +78 -0
  366. package/src/analytics/schema.ts +60 -0
  367. package/src/analytics/script.ts +60 -0
  368. package/src/analytics/segment.ts +85 -0
  369. package/src/analytics/vercel.ts +50 -0
  370. package/src/astro/adapter-root.ts +7 -9
  371. package/src/astro/component-slots.ts +131 -91
  372. package/src/astro/generate.ts +114 -345
  373. package/src/astro/integration.ts +2 -6
  374. package/src/astro/pages.ts +13 -101
  375. package/src/astro/render-deps.ts +379 -0
  376. package/src/astro/runtime-deps.ts +201 -0
  377. package/src/astro/templates.ts +554 -541
  378. package/src/audit/agent.ts +24 -0
  379. package/src/audit/catalog.ts +2 -2
  380. package/src/audit/checks/assets.ts +2 -2
  381. package/src/audit/checks/dns-aid.ts +1 -1
  382. package/src/audit/checks/duplicates.ts +3 -1
  383. package/src/audit/checks/i18n.ts +1 -1
  384. package/src/audit/checks/indexability.ts +7 -7
  385. package/src/audit/checks/links.ts +2 -2
  386. package/src/audit/checks/llms.ts +6 -6
  387. package/src/audit/checks/network.ts +3 -3
  388. package/src/audit/checks/og-image.ts +2 -2
  389. package/src/audit/checks/robots.ts +1 -1
  390. package/src/audit/checks/sitemap.ts +2 -2
  391. package/src/audit/checks/social.ts +1 -1
  392. package/src/audit/run.ts +4 -3
  393. package/src/audit/terms.ts +31 -0
  394. package/src/audit/url.ts +13 -13
  395. package/src/cli/command-meta.ts +10 -0
  396. package/src/cli/commands/audit.ts +39 -20
  397. package/src/cli/commands/build.ts +71 -314
  398. package/src/cli/commands/check.ts +1 -0
  399. package/src/cli/commands/dev.ts +40 -1
  400. package/src/cli/commands/doctor.ts +90 -14
  401. package/src/cli/commands/eject.ts +44 -7
  402. package/src/cli/commands/eval.ts +2 -2
  403. package/src/cli/commands/init.ts +161 -41
  404. package/src/cli/commands/migrate.ts +121 -0
  405. package/src/cli/commands/preview.ts +7 -1
  406. package/src/cli/commands/translate.ts +2 -2
  407. package/src/cli/commands/upgrade.ts +141 -0
  408. package/src/cli/commands/version.ts +57 -44
  409. package/src/cli/eject-scripts.ts +121 -6
  410. package/src/cli/index.ts +11 -1
  411. package/src/cli/init/install.ts +70 -0
  412. package/src/cli/init/questions.ts +7 -0
  413. package/src/cli/init/scaffold.ts +459 -75
  414. package/src/cli/lazy-command.ts +37 -1
  415. package/src/cli/prepare.ts +40 -6
  416. package/src/cli/required-secrets.ts +38 -11
  417. package/src/cli/unknown-flags.ts +266 -0
  418. package/src/cli/yarn-pnp.ts +52 -0
  419. package/src/components/content/AccordionItem.astro +7 -1
  420. package/src/components/content/Card.astro +4 -3
  421. package/src/components/content/ColorItem.astro +22 -4
  422. package/src/components/content/GithubInfo.astro +2 -2
  423. package/src/components/content/Prompt.astro +25 -25
  424. package/src/components/content/Tabs.astro +3 -1
  425. package/src/components/content/Tile.astro +2 -3
  426. package/src/components/content/Tooltip.astro +57 -9
  427. package/src/components/content/content-strings.ts +34 -0
  428. package/src/components/content/diff.ts +1 -1
  429. package/src/components/content/mermaid-element.ts +13 -2
  430. package/src/components/content/prompt-markdown.ts +292 -0
  431. package/src/components/content/tooltip-id.ts +41 -0
  432. package/src/components/islands/hooks.ts +75 -3
  433. package/src/components/layout/Analytics.astro +21 -79
  434. package/src/components/layout/Banner.astro +3 -1
  435. package/src/components/layout/DiscoveryLinks.astro +69 -0
  436. package/src/components/layout/Header.astro +83 -20
  437. package/src/components/layout/LanguageSwitcher.astro +4 -1
  438. package/src/components/layout/Logo.astro +23 -2
  439. package/src/components/layout/NavSelector.astro +13 -2
  440. package/src/components/layout/NavTree.astro +12 -3
  441. package/src/components/layout/NavTreeScript.astro +17 -3
  442. package/src/components/layout/PageActions.astro +3 -3
  443. package/src/components/layout/PageFeedback.astro +11 -1
  444. package/src/components/layout/PageLayout.astro +52 -5
  445. package/src/components/layout/ReferenceLayout.astro +21 -12
  446. package/src/components/layout/RootLayout.astro +69 -43
  447. package/src/components/layout/Search.astro +30 -6
  448. package/src/components/layout/WebMcp.astro +1 -1
  449. package/src/components/layout/analytics-client.ts +101 -15
  450. package/src/components/layout/drawer-inert.ts +113 -15
  451. package/src/components/layout/dropdown-clamp.ts +105 -0
  452. package/src/components/layout/head-scripts.ts +15 -6
  453. package/src/components/layout/nav-utils.ts +17 -0
  454. package/src/components/layout/search/algolia.ts +8 -8
  455. package/src/components/layout/search/orama-cloud.ts +9 -7
  456. package/src/components/layout/search/typesense.ts +11 -17
  457. package/src/components/openapi/MessageComposer.astro +2 -2
  458. package/src/components/openapi/Playground.astro +2 -2
  459. package/src/components/openapi/playground-client.ts +79 -10
  460. package/src/core/changelog-index.ts +24 -0
  461. package/src/core/component-overrides.ts +399 -154
  462. package/src/core/config-input.ts +212 -543
  463. package/src/core/config.ts +130 -41
  464. package/src/core/custom-pages.ts +105 -0
  465. package/src/core/data.ts +32 -11
  466. package/src/core/define-components.ts +12 -9
  467. package/src/core/deployment-env.ts +18 -74
  468. package/src/core/diagnostics.ts +14 -7
  469. package/src/core/graph.ts +69 -25
  470. package/src/core/i18n-ui.ts +6 -2
  471. package/src/core/i18n.ts +17 -0
  472. package/src/core/includes.ts +156 -38
  473. package/src/core/last-modified.ts +6 -11
  474. package/src/core/links.ts +166 -2
  475. package/src/core/manifest.ts +10 -3
  476. package/src/core/navigation.ts +137 -19
  477. package/src/core/new-tab.ts +35 -0
  478. package/src/core/node-require.ts +21 -0
  479. package/src/core/project-graph.ts +42 -26
  480. package/src/core/project.ts +9 -4
  481. package/src/core/request-body.ts +61 -0
  482. package/src/core/safe-href.ts +28 -0
  483. package/src/core/safe-links.ts +68 -0
  484. package/src/core/schema.ts +531 -721
  485. package/src/core/server-features.ts +8 -9
  486. package/src/core/sources/assets.ts +47 -11
  487. package/src/core/sources/collection.ts +67 -0
  488. package/src/core/sources/contentful-rich-text.ts +285 -0
  489. package/src/core/sources/contentful.ts +173 -0
  490. package/src/core/sources/github-releases.ts +51 -1
  491. package/src/core/sources/json.ts +71 -0
  492. package/src/core/sources/lexical.ts +195 -0
  493. package/src/core/sources/lower.ts +226 -0
  494. package/src/core/sources/normalize.ts +52 -2
  495. package/src/core/sources/notion.ts +39 -28
  496. package/src/core/sources/payload.ts +135 -0
  497. package/src/core/sources/portable-text.ts +11 -16
  498. package/src/core/sources/remote.ts +226 -0
  499. package/src/core/sources/resolve.ts +104 -166
  500. package/src/core/sources/sanity.ts +16 -49
  501. package/src/core/sources/strapi-blocks.ts +124 -0
  502. package/src/core/sources/strapi.ts +191 -0
  503. package/src/core/sources/types.ts +12 -1
  504. package/src/core/types.ts +20 -1
  505. package/src/core/ui-packs/ar.ts +6 -2
  506. package/src/core/ui-packs/bg.ts +6 -2
  507. package/src/core/ui-packs/bn.ts +6 -2
  508. package/src/core/ui-packs/ca.ts +3 -1
  509. package/src/core/ui-packs/cs.ts +6 -2
  510. package/src/core/ui-packs/da.ts +6 -2
  511. package/src/core/ui-packs/de.ts +6 -2
  512. package/src/core/ui-packs/el.ts +3 -1
  513. package/src/core/ui-packs/es.ts +3 -1
  514. package/src/core/ui-packs/fa.ts +6 -2
  515. package/src/core/ui-packs/fi.ts +6 -2
  516. package/src/core/ui-packs/fr.ts +3 -1
  517. package/src/core/ui-packs/he.ts +6 -2
  518. package/src/core/ui-packs/hi.ts +6 -2
  519. package/src/core/ui-packs/hr.ts +6 -2
  520. package/src/core/ui-packs/hu.ts +6 -2
  521. package/src/core/ui-packs/id.ts +6 -2
  522. package/src/core/ui-packs/it.ts +3 -1
  523. package/src/core/ui-packs/ja.ts +3 -1
  524. package/src/core/ui-packs/ko.ts +3 -1
  525. package/src/core/ui-packs/nl.ts +6 -2
  526. package/src/core/ui-packs/no.ts +6 -2
  527. package/src/core/ui-packs/pl.ts +6 -2
  528. package/src/core/ui-packs/pt-br.ts +3 -1
  529. package/src/core/ui-packs/pt.ts +3 -1
  530. package/src/core/ui-packs/ro.ts +6 -2
  531. package/src/core/ui-packs/ru.ts +6 -2
  532. package/src/core/ui-packs/sk.ts +6 -2
  533. package/src/core/ui-packs/sr.ts +6 -2
  534. package/src/core/ui-packs/sv.ts +6 -2
  535. package/src/core/ui-packs/th.ts +3 -1
  536. package/src/core/ui-packs/tr.ts +6 -2
  537. package/src/core/ui-packs/uk.ts +6 -2
  538. package/src/core/ui-packs/vi.ts +3 -1
  539. package/src/core/ui-packs/zh-tw.ts +3 -1
  540. package/src/core/ui-packs/zh.ts +3 -1
  541. package/src/core/unrecognized-keys.ts +10 -0
  542. package/src/core/version-cut.ts +116 -8
  543. package/src/deploy/adapter-output.ts +57 -97
  544. package/src/deploy/adapters/cloudflare.ts +39 -0
  545. package/src/deploy/adapters/index.ts +41 -0
  546. package/src/deploy/adapters/netlify.ts +34 -0
  547. package/src/deploy/adapters/node.ts +34 -0
  548. package/src/deploy/adapters/registry.ts +127 -0
  549. package/src/deploy/adapters/types.ts +92 -0
  550. package/src/deploy/adapters/vercel.ts +35 -0
  551. package/src/deploy/artifacts.ts +67 -28
  552. package/src/deploy/cloudflare-negotiation.ts +179 -100
  553. package/src/deploy/function-bundle.ts +18 -3
  554. package/src/deploy/headers.ts +129 -22
  555. package/src/deploy/node-headers.ts +198 -0
  556. package/src/deploy/platforms/cloudflare.ts +312 -0
  557. package/src/deploy/platforms/index.ts +67 -0
  558. package/src/deploy/platforms/netlify.ts +52 -0
  559. package/src/deploy/platforms/node.ts +40 -0
  560. package/src/deploy/platforms/paths.ts +42 -0
  561. package/src/deploy/platforms/static.ts +29 -0
  562. package/src/deploy/platforms/types.ts +112 -0
  563. package/src/deploy/platforms/vercel.ts +193 -0
  564. package/src/deploy/redirects.ts +30 -18
  565. package/src/deploy/robots.ts +3 -3
  566. package/src/deploy/rss.ts +2 -2
  567. package/src/deploy/sitemap.ts +2 -2
  568. package/src/deploy/vercel-negotiation.ts +27 -4
  569. package/src/eval/agents.ts +32 -1
  570. package/src/eval/findings.ts +19 -11
  571. package/src/eval/report.ts +10 -2
  572. package/src/markdown/external-links.ts +65 -0
  573. package/src/markdown/include.ts +45 -27
  574. package/src/markdown/index.ts +34 -9
  575. package/src/markdown/inline-code.ts +12 -6
  576. package/src/markdown/relative-links.ts +324 -0
  577. package/src/markdown/themes.ts +3 -3
  578. package/src/migrate/migrate.ts +149 -0
  579. package/src/openapi/parse.ts +64 -16
  580. package/src/openapi/proxy.ts +62 -10
  581. package/src/openapi/references.ts +147 -147
  582. package/src/openapi/render-mdx.ts +32 -10
  583. package/src/openapi/scalar.ts +15 -13
  584. package/src/openapi/sentence.ts +14 -0
  585. package/src/openapi/source.ts +37 -21
  586. package/src/openapi/spec-dependency-error.ts +15 -0
  587. package/src/reference/asyncapi.ts +83 -0
  588. package/src/reference/graphql.ts +89 -0
  589. package/src/reference/index.ts +40 -0
  590. package/src/reference/openapi.ts +83 -0
  591. package/src/reference/options.ts +201 -0
  592. package/src/reference/scalar.ts +136 -0
  593. package/src/reference/schema.ts +88 -0
  594. package/src/registry/eject.ts +97 -42
  595. package/src/search/adapters/algolia.ts +46 -0
  596. package/src/search/adapters/flexsearch.ts +29 -0
  597. package/src/search/adapters/index.ts +39 -0
  598. package/src/search/adapters/mixedbread.ts +39 -0
  599. package/src/search/adapters/orama-cloud.ts +51 -0
  600. package/src/search/adapters/orama.ts +24 -0
  601. package/src/search/adapters/pagefind.ts +27 -0
  602. package/src/search/adapters/registry.ts +131 -0
  603. package/src/search/adapters/types.ts +46 -0
  604. package/src/search/adapters/typesense.ts +57 -0
  605. package/src/search/build.ts +33 -7
  606. package/src/search/documents.ts +6 -0
  607. package/src/search/sync/algolia.ts +12 -11
  608. package/src/search/sync/index.ts +35 -20
  609. package/src/search/sync/orama-cloud.ts +12 -9
  610. package/src/search/sync/typesense.ts +15 -13
  611. package/src/sources/contentful.ts +63 -0
  612. package/src/sources/custom.ts +38 -0
  613. package/src/sources/filesystem.ts +51 -0
  614. package/src/sources/github-releases.ts +52 -0
  615. package/src/sources/index.ts +60 -0
  616. package/src/sources/mdx-remote.ts +76 -0
  617. package/src/sources/notion.ts +63 -0
  618. package/src/sources/obsidian.ts +38 -0
  619. package/src/sources/payload.ts +60 -0
  620. package/src/sources/registry.ts +182 -0
  621. package/src/sources/sanity.ts +66 -0
  622. package/src/sources/shared.ts +52 -0
  623. package/src/sources/strapi.ts +58 -0
  624. package/src/theme/entry.ts +47 -2
  625. package/src/translate/report.ts +40 -7
  626. package/src/upgrade/upgrade.ts +499 -0
  627. package/dist/cli/chunk-12dxjqk7.js.map +0 -10
  628. package/dist/cli/chunk-196vjxp9.js.map +0 -13
  629. package/dist/cli/chunk-2mzebbbz.js +0 -69
  630. package/dist/cli/chunk-2z47ypj8.js.map +0 -11
  631. package/dist/cli/chunk-30e87n55.js +0 -108
  632. package/dist/cli/chunk-30e87n55.js.map +0 -10
  633. package/dist/cli/chunk-450a7rcr.js +0 -185
  634. package/dist/cli/chunk-450a7rcr.js.map +0 -11
  635. package/dist/cli/chunk-5n7t497w.js.map +0 -40
  636. package/dist/cli/chunk-61j18dwk.js +0 -5342
  637. package/dist/cli/chunk-61j18dwk.js.map +0 -58
  638. package/dist/cli/chunk-88by27n5.js +0 -17
  639. package/dist/cli/chunk-88by27n5.js.map +0 -10
  640. package/dist/cli/chunk-8cd8tj54.js.map +0 -34
  641. package/dist/cli/chunk-aztttvb3.js +0 -381
  642. package/dist/cli/chunk-aztttvb3.js.map +0 -12
  643. package/dist/cli/chunk-cvky9gb2.js.map +0 -11
  644. package/dist/cli/chunk-ejjx8znq.js.map +0 -15
  645. package/dist/cli/chunk-fmceyezb.js +0 -1007
  646. package/dist/cli/chunk-fmceyezb.js.map +0 -13
  647. package/dist/cli/chunk-hdm2dkd2.js.map +0 -48
  648. package/dist/cli/chunk-hs3gbh8p.js.map +0 -10
  649. package/dist/cli/chunk-jbj4qhfw.js +0 -30
  650. package/dist/cli/chunk-jbj4qhfw.js.map +0 -10
  651. package/dist/cli/chunk-mqb2ka8m.js +0 -68
  652. package/dist/cli/chunk-mqb2ka8m.js.map +0 -10
  653. package/dist/cli/chunk-mt76t7dj.js.map +0 -11
  654. package/dist/cli/chunk-q4rae3bg.js +0 -60
  655. package/dist/cli/chunk-q4rae3bg.js.map +0 -10
  656. package/dist/cli/chunk-ra1v2nc2.js +0 -35
  657. package/dist/cli/chunk-ra1v2nc2.js.map +0 -10
  658. package/dist/cli/chunk-t3tj0dgr.js.map +0 -15
  659. package/dist/cli/chunk-tqa1s0k8.js +0 -69
  660. package/dist/cli/chunk-tqa1s0k8.js.map +0 -11
  661. package/dist/cli/chunk-vh9w1sgp.js +0 -73
  662. package/dist/cli/chunk-vh9w1sgp.js.map +0 -10
  663. package/dist/cli/chunk-vkrsvbr5.js +0 -107
  664. package/dist/cli/chunk-vkrsvbr5.js.map +0 -11
  665. package/dist/cli/chunk-vrfp10qk.js +0 -81
  666. package/dist/cli/chunk-vrfp10qk.js.map +0 -10
  667. package/dist/cli/chunk-wjt80jps.js +0 -1049
  668. package/dist/cli/chunk-wjt80jps.js.map +0 -24
  669. package/docs/advanced/api-reference.mdx +0 -240
  670. package/docs/reference/cli.mdx +0 -197
  671. package/skills/blume-migrate/assets/oxfmt@0.55.0.patch +0 -20
  672. package/src/components/content/changelog-element.ts +0 -69
  673. package/src/search/providers.ts +0 -91
  674. /package/dist/cli/{chunk-3w7b2vcx.js.map → chunk-7ez8ny0t.js.map} +0 -0
  675. /package/dist/cli/{chunk-688e0dde.js.map → chunk-88cpgt6h.js.map} +0 -0
  676. /package/dist/cli/{chunk-exeeb35e.js.map → chunk-f7t03s3g.js.map} +0 -0
  677. /package/dist/cli/{chunk-ppfvdcd4.js.map → chunk-zxccj738.js.map} +0 -0
@@ -1,61 +1,32 @@
1
1
  import { existsSync } from "node:fs";
2
- import { readdir, readFile, stat, writeFile } from "node:fs/promises";
2
+ import { readdir, stat } from "node:fs/promises";
3
3
 
4
4
  import { build } from "astro";
5
5
  import { defineCommand } from "citty";
6
6
  import { join } from "pathe";
7
7
 
8
- import {
9
- API_CATALOG_PATH,
10
- API_CATALOG_TYPE,
11
- hasApiCatalog,
12
- } from "../../ai/api-catalog.ts";
13
- import { pageJsonPath } from "../../ai/api/paths.ts";
14
- import { buildHomeLinkHeader } from "../../ai/link-headers.ts";
15
- import {
16
- agentMarkdown,
17
- buildRawMarkdown,
18
- markdownRoutePaths,
19
- markdownTokenCount,
20
- } from "../../ai/markdown.ts";
21
- import {
22
- SIGNATURES_DIRECTORY_PATH,
23
- SIGNATURES_DIRECTORY_TYPE,
24
- } from "../../ai/web-bot-auth.ts";
25
8
  import { publishBuildProject } from "../../astro/integration.ts";
26
9
  import { ensureGitignore } from "../../core/gitignore.ts";
27
10
  import type { BlumeProject } from "../../core/project-graph.ts";
28
- import type { ResolvedConfig } from "../../core/schema.ts";
29
11
  import { serverFeatures } from "../../core/server-features.ts";
30
- import type { ProjectContext } from "../../core/types.ts";
31
12
  import {
32
- ADAPTER_IGNORE_DIRS,
13
+ deployOutputDir,
33
14
  deployStaticDir,
34
- servesClientSubdir,
35
15
  surfaceAdapterOutput,
36
16
  } from "../../deploy/adapter-output.ts";
37
- import {
38
- injectWorkerNegotiation,
39
- NEGOTIATION_WORKER_FILE,
40
- } from "../../deploy/cloudflare-negotiation.ts";
41
- import {
42
- auditVercelFunctions,
43
- blumeDependencyNames,
44
- functionBundleVerdict,
45
- } from "../../deploy/function-bundle.ts";
46
- import { platformRedirects } from "../../deploy/redirects.ts";
47
- import { injectNegotiationRoutes } from "../../deploy/vercel-negotiation.ts";
17
+ import { deployPlatform } from "../../deploy/platforms/index.ts";
48
18
  import { cardCacheTally, ogCacheDir, pruneCardCache } from "../../og/cache.ts";
19
+ import {
20
+ flagList,
21
+ removedBuildFlags,
22
+ removedBuildFlagsAdvice,
23
+ } from "../../upgrade/upgrade.ts";
49
24
  import { commandMeta } from "../command-meta.ts";
50
25
  import { refuseIfDevRunning } from "../dev-lock.ts";
26
+ import { refuseIfEjected } from "../eject-scripts.ts";
51
27
  import { logger } from "../log.ts";
52
28
  import { prepareProject } from "../prepare.ts";
53
29
 
54
- const ADAPTERS = ["vercel", "node", "netlify", "cloudflare"] as const;
55
-
56
- const isAdapter = (value: string): value is (typeof ADAPTERS)[number] =>
57
- ADAPTERS.some((adapter) => adapter === value);
58
-
59
30
  const BUDGET_JS = "budget-js";
60
31
  const BUDGET_CSS = "budget-css";
61
32
 
@@ -85,170 +56,6 @@ const validateBudgetFlags = (args: BudgetArgs): void => {
85
56
  }
86
57
  };
87
58
 
88
- /**
89
- * Splice `Accept: text/markdown` negotiation routes into the Vercel adapter's
90
- * Build Output config, so a content-page request that prefers Markdown gets the
91
- * page's prerendered `.md` mirror (content pages are prerendered even in server
92
- * output, so Astro middleware never sees them — the routing layer is the only
93
- * request-time hook). Vercel server builds only; the adapter writes the config
94
- * straight to the project root (see `withAdapterRoot`).
95
- */
96
- const emitVercelNegotiation = async (
97
- project: BlumeProject,
98
- routePaths: string[],
99
- root: string
100
- ): Promise<void> => {
101
- const { config } = project;
102
- const configPath = join(root, ".vercel", "output", "config.json");
103
- if (!existsSync(configPath)) {
104
- return;
105
- }
106
- const overrides: Record<string, string> = {};
107
- if (hasApiCatalog(config)) {
108
- overrides[API_CATALOG_PATH.slice(1)] = API_CATALOG_TYPE;
109
- }
110
- if (config.ai.webBotAuth.keys.length > 0) {
111
- overrides[SIGNATURES_DIRECTORY_PATH.slice(1)] = SIGNATURES_DIRECTORY_TYPE;
112
- }
113
- // The homepage rewrite serves `/index.md` from the static layer, so its
114
- // `x-markdown-tokens` estimate has to ride the routing config; the runtime
115
- // endpoint stamps it on dev/server-rendered responses itself.
116
- const rawMarkdown = await buildRawMarkdown(project);
117
- const home = rawMarkdown["/"];
118
- // The Markdown and JSON 404 routes point at the prerendered twins; only
119
- // wire each when the build actually emitted it (a project that owns `/404`
120
- // gets none).
121
- const staticDir = join(root, ".vercel", "output", "static");
122
- const injected = injectNegotiationRoutes(
123
- await readFile(configPath, "utf-8"),
124
- routePaths,
125
- buildHomeLinkHeader(config, routePaths),
126
- overrides,
127
- home ? markdownTokenCount(agentMarkdown(home)) : undefined,
128
- {
129
- json: existsSync(join(staticDir, "404.json")),
130
- markdown: existsSync(join(staticDir, "404.md")),
131
- }
132
- );
133
- if (injected === null) {
134
- logger.warn(
135
- "Could not wire Accept: text/markdown negotiation into .vercel/output/config.json — raw Markdown stays available at the .md URLs."
136
- );
137
- return;
138
- }
139
- await writeFile(configPath, injected, "utf-8");
140
- logger.success(
141
- "Wired Accept: text/markdown negotiation into the Vercel routing config"
142
- );
143
- };
144
-
145
- /**
146
- * Refuse to ship a Vercel function bundle that would crash at runtime: a bare
147
- * import the adapter's dependency trace silently dropped (see
148
- * `deploy/function-bundle.ts`). A missing package that is one of Blume's own
149
- * dependencies is fatal — the generated runtime imports it, so every request
150
- * would die; a project's own external import is reported as a warning and left
151
- * to the author.
152
- */
153
- const checkVercelFunctionBundles = async (
154
- outputDir: string,
155
- root: string
156
- ): Promise<void> => {
157
- const audits = await auditVercelFunctions(outputDir);
158
- if (audits.length === 0) {
159
- return;
160
- }
161
- const own = blumeDependencyNames();
162
- let fatal = false;
163
- for (const audit of audits) {
164
- const verdict = functionBundleVerdict(audit, root, own);
165
- if (verdict.fatal) {
166
- fatal = true;
167
- logger.error(verdict.message);
168
- } else {
169
- logger.warn(verdict.message);
170
- }
171
- }
172
- if (fatal) {
173
- process.exit(1);
174
- }
175
- };
176
-
177
- const warnCloudflareNegotiationSkipped = (): void =>
178
- logger.warn(
179
- "Could not wire Accept: text/markdown negotiation into dist/server/wrangler.json — raw Markdown stays available at the .md URLs."
180
- );
181
-
182
- /**
183
- * Wire `Accept: text/markdown` negotiation into a Cloudflare server build. The
184
- * ASSETS binding serves the prerendered content pages before the Worker runs —
185
- * and even a request that reaches the Worker is answered by the adapter's
186
- * handler from that binding, ahead of the only place middleware runs — so the
187
- * negotiation lives in a generated wrapper Worker, routed to by
188
- * `assets.run_worker_first` (see `deploy/cloudflare-negotiation.ts`). Both
189
- * pieces are spliced into the adapter's emitted `dist/server` bundle.
190
- */
191
- const emitCloudflareNegotiation = async (
192
- project: BlumeProject,
193
- routePaths: string[]
194
- ): Promise<void> => {
195
- const { config, context } = project;
196
- const serverDir = join(
197
- context.distDir ?? join(context.root, "dist"),
198
- "server"
199
- );
200
- const wranglerPath = join(serverDir, "wrangler.json");
201
- if (!existsSync(wranglerPath)) {
202
- warnCloudflareNegotiationSkipped();
203
- return;
204
- }
205
- // The homepage mirror is served from the static layer, so its
206
- // `x-markdown-tokens` estimate rides the wrapper Worker, mirroring the
207
- // Vercel routing config.
208
- const rawMarkdown = await buildRawMarkdown(project);
209
- const home = rawMarkdown["/"];
210
- const injected = injectWorkerNegotiation(
211
- await readFile(wranglerPath, "utf-8"),
212
- {
213
- base: config.deployment.base,
214
- // The manifest routes guard the wrapper's redirect table; `routePaths`
215
- // also carries the synthesized homepage mirror, which must not block a
216
- // configured root redirect.
217
- contentRoutePaths: project.manifest.routes.map((route) => route.path),
218
- homeLinkHeader: buildHomeLinkHeader(config, routePaths),
219
- homeTokens: home ? markdownTokenCount(agentMarkdown(home)) : undefined,
220
- // Exactly the per-page JSON documents the API emits (see `pageParams`):
221
- // the non-hidden routes with agent Markdown, when the API is on.
222
- pageJsonPaths: config.ai.api
223
- ? project.manifest.routes
224
- .filter(
225
- (route) => !route.hidden && rawMarkdown[route.path] !== undefined
226
- )
227
- .map((route) => pageJsonPath(route.path))
228
- : [],
229
- // The wrapper Worker matches full served URLs, so the redirects are
230
- // based the same way the platform files are — it answers any the
231
- // worker-first rules claim, where `_redirects` is never consulted and
232
- // Astro would default their status.
233
- redirects: platformRedirects(config),
234
- routePaths,
235
- }
236
- );
237
- if (injected === null) {
238
- warnCloudflareNegotiationSkipped();
239
- return;
240
- }
241
- await writeFile(
242
- join(serverDir, NEGOTIATION_WORKER_FILE),
243
- injected.worker,
244
- "utf-8"
245
- );
246
- await writeFile(wranglerPath, injected.wrangler, "utf-8");
247
- logger.success(
248
- "Wired Accept: text/markdown negotiation into the Cloudflare Worker"
249
- );
250
- };
251
-
252
59
  /**
253
60
  * Report how many OG cards the build read back from the on-disk cache against
254
61
  * how many it rendered (the endpoint tallies both), so a warm rebuild shows
@@ -388,46 +195,6 @@ export const runClientAssetChecks = async (
388
195
  }
389
196
  };
390
197
 
391
- /**
392
- * Root of an isolated build's output. The runtime-local `dist/`, except for a
393
- * Vercel server build, whose deploy bundle lands at `<runtime>/.vercel/output`
394
- * and is never surfaced to the project root.
395
- */
396
- export const isolatedOutputDir = (
397
- config: ResolvedConfig,
398
- context: ProjectContext
399
- ): string => {
400
- const { adapter, output } = config.deployment;
401
- if (output === "server" && adapter === "vercel") {
402
- return join(context.outDir, ".vercel", "output");
403
- }
404
- return context.distDir ?? join(context.outDir, "dist");
405
- };
406
-
407
- /**
408
- * Directory holding an isolated build's client `_astro/` assets. Mirrors
409
- * `deployStaticDir`, except that an isolated build never surfaces the adapter
410
- * bundle to the project root — a Vercel server build's static output stays at
411
- * `<runtime>/.vercel/output/static`, where `deployStaticDir` would instead
412
- * point at the project-root copy (a previous real build's assets, or nothing).
413
- * Node and Cloudflare server builds serve one level down, at `client/` — see
414
- * {@link servesClientSubdir}.
415
- */
416
- export const isolatedStaticDir = (
417
- config: ResolvedConfig,
418
- context: ProjectContext
419
- ): string => {
420
- const { adapter, output } = config.deployment;
421
- const outputDir = isolatedOutputDir(config, context);
422
- if (output === "server" && adapter === "vercel") {
423
- return join(outputDir, "static");
424
- }
425
- if (servesClientSubdir(config.deployment)) {
426
- return join(outputDir, "client");
427
- }
428
- return outputDir;
429
- };
430
-
431
198
  /**
432
199
  * Print the build summary box and run the optional bundle report / budget
433
200
  * gate against the served static dir. The deploy artifacts themselves
@@ -448,19 +215,29 @@ const reportBuild = async (
448
215
  const sitemapNote = config.seo.sitemap
449
216
  ? "no (set deployment.site)"
450
217
  : "no (seo.sitemap is false)";
451
- logger.box(
218
+ const rows: [label: string, value: string | number][] = [
219
+ ["Output", config.deployment.options.output],
220
+ ["Adapter", config.deployment.kind],
221
+ ["Site", config.deployment.options.site ?? "not set"],
222
+ ["Search", config.search.provider.kind],
223
+ ["Redirects", config.redirects.length],
452
224
  [
453
- `Output ${config.deployment.output}`,
454
- `Adapter ${config.deployment.adapter ?? "none"}`,
455
- `Site ${config.deployment.site ?? "not set"}`,
456
- `Search ${config.search.provider}`,
457
- `Redirects ${config.redirects.length}`,
458
- `Sitemap ${config.deployment.site && config.seo.sitemap ? "yes" : sitemapNote}`,
459
- `Robots ${config.seo.robots ? "yes" : "no"}`,
460
- `Agent JSON ${config.seo.agentReadability ? "yes" : "no"}`,
461
- `LLM files ${config.ai.llmsTxt.enabled ? "yes" : "no"}`,
462
- `Server features ${features.length > 0 ? features.join(", ") : "none"}`,
463
- ].join("\n")
225
+ "Sitemap",
226
+ config.deployment.options.site && config.seo.sitemap
227
+ ? "yes"
228
+ : sitemapNote,
229
+ ],
230
+ ["Robots", config.seo.robots ? "yes" : "no"],
231
+ ["Agent JSON", config.agents.agentReadability ? "yes" : "no"],
232
+ ["LLM files", config.agents.llmsTxt.enabled ? "yes" : "no"],
233
+ ["Server features", features.length > 0 ? features.join(", ") : "none"],
234
+ ];
235
+ // One label column for every row, sized by the longest label.
236
+ const labelWidth = Math.max(...rows.map(([label]) => label.length)) + 2;
237
+ logger.box(
238
+ rows
239
+ .map(([label, value]) => `${label.padEnd(labelWidth)}${value}`)
240
+ .join("\n")
464
241
  );
465
242
 
466
243
  await runClientAssetChecks(distDir, args);
@@ -477,18 +254,10 @@ const reportBuild = async (
477
254
 
478
255
  export const buildCommand = defineCommand({
479
256
  args: {
480
- adapter: {
481
- description: "Server adapter: vercel | node | netlify | cloudflare.",
482
- type: "string",
483
- },
484
257
  analyze: {
485
258
  description: "Report client JavaScript bundle sizes after the build.",
486
259
  type: "boolean",
487
260
  },
488
- base: {
489
- description: "Base path the site is served under (e.g. /docs).",
490
- type: "string",
491
- },
492
261
  [BUDGET_CSS]: {
493
262
  description: "Fail if total client CSS exceeds this many kB.",
494
263
  type: "string",
@@ -502,10 +271,6 @@ export const buildCommand = defineCommand({
502
271
  "Build into an isolated .blume-verify runtime (and its own dist) so a running dev server and the real dist/ are untouched. For verifying changes while `blume dev` runs.",
503
272
  type: "boolean",
504
273
  },
505
- output: {
506
- description: "Output mode: static | server.",
507
- type: "string",
508
- },
509
274
  preview: {
510
275
  description: "Include drafts and unpublished CMS content.",
511
276
  type: "boolean",
@@ -518,9 +283,20 @@ export const buildCommand = defineCommand({
518
283
  },
519
284
  },
520
285
  meta: commandMeta.build,
521
- async run({ args }) {
286
+ async run({ args, rawArgs }) {
522
287
  const root = process.cwd();
523
288
 
289
+ // citty accepts unknown flags, so a Blume 1 `--adapter vercel --output
290
+ // server` would otherwise build a static site without a word.
291
+ const removed = removedBuildFlags(rawArgs);
292
+ if (removed.length > 0) {
293
+ logger.error(
294
+ `blume build no longer takes ${flagList(removed)}. ${removedBuildFlagsAdvice(removed)}`
295
+ );
296
+ process.exit(1);
297
+ }
298
+ await refuseIfEjected(root, "build");
299
+
524
300
  // `--isolated` (or BLUME_RUNTIME_DIR) relocates the whole runtime to a
525
301
  // sibling dir so this build never touches a live dev server's `.blume/` or
526
302
  // the user's real `dist/`. A non-default runtime dir has no dev lock, so the
@@ -533,29 +309,10 @@ export const buildCommand = defineCommand({
533
309
  await ensureGitignore(root, [".blume-verify/"]);
534
310
  }
535
311
 
536
- if (args.output && args.output !== "static" && args.output !== "server") {
537
- logger.error(`Invalid --output "${args.output}" (use static | server).`);
538
- process.exit(1);
539
- }
540
- if (args.adapter && !isAdapter(args.adapter)) {
541
- logger.error(
542
- `Invalid --adapter "${args.adapter}" (use ${ADAPTERS.join(" | ")}).`
543
- );
544
- process.exit(1);
545
- }
546
312
  validateBudgetFlags(args);
547
313
 
548
314
  const project = await prepareProject({
549
315
  mode: "build",
550
- overrides: {
551
- // SAFETY: an invalid --adapter exited above; a set flag is an ADAPTERS
552
- // member.
553
- adapter: args.adapter as (typeof ADAPTERS)[number] | undefined,
554
- base: args.base,
555
- // SAFETY: an invalid --output exited above; a set flag is static or
556
- // server.
557
- output: args.output as "server" | "static" | undefined,
558
- },
559
316
  preview: args.preview,
560
317
  root,
561
318
  runtimeDir,
@@ -563,7 +320,7 @@ export const buildCommand = defineCommand({
563
320
  });
564
321
 
565
322
  logger.start(
566
- `Building ${project.graph.pages.length} page(s) (${project.config.deployment.output} output)`
323
+ `Building ${project.graph.pages.length} page(s) (${project.config.deployment.options.output} output)`
567
324
  );
568
325
 
569
326
  // Hand the scanned project to the integration: its `astro:build:done`
@@ -585,25 +342,36 @@ export const buildCommand = defineCommand({
585
342
  // cards a live dev server is still serving.
586
343
  await reportCardCache(project, !runtimeDir);
587
344
 
588
- // The bundle report and budget gate still run for an isolated build —
589
- // `blume build --isolated --budget-js 100` exiting 0 without measuring
590
- // anything would be a silent false pass in CI.
591
- if (runtimeDir) {
345
+ // Everything the deploy target does differently after `astro build` comes
346
+ // off its platform (see `deploy/platforms/*`): a server build's post-build
347
+ // step (Vercel's function-bundle audit and negotiation routes, Cloudflare's
348
+ // wrapper Worker), and where its bundle and static assets landed.
349
+ const { deployment } = project.config;
350
+ const platform = deployPlatform(deployment);
351
+ const server = deployment.options.output === "server";
352
+ const finalize = async (isolated: boolean): Promise<void> => {
592
353
  if (
593
- project.config.deployment.output === "server" &&
594
- project.config.deployment.adapter === "vercel"
354
+ server &&
355
+ platform.finalizeBuild &&
356
+ !(await platform.finalizeBuild({ isolated, log: logger, project }))
595
357
  ) {
596
- await checkVercelFunctionBundles(
597
- isolatedOutputDir(project.config, project.context),
598
- root
599
- );
358
+ process.exit(1);
600
359
  }
360
+ };
361
+
362
+ // The bundle report and budget gate still run for an isolated build —
363
+ // `blume build --isolated --budget-js 100` exiting 0 without measuring
364
+ // anything would be a silent false pass in CI. An isolated build never
365
+ // surfaces the adapter bundle to the project root, so its output dirs
366
+ // resolve under the relocated runtime.
367
+ if (runtimeDir) {
368
+ await finalize(true);
601
369
  await runClientAssetChecks(
602
- isolatedStaticDir(project.config, project.context),
370
+ deployStaticDir(project.config, project.context),
603
371
  args
604
372
  );
605
373
  logger.success(
606
- `Isolated build OK — output at ${isolatedOutputDir(project.config, project.context)} (not published).`
374
+ `Isolated build OK — output at ${deployOutputDir(project.config, project.context)} (not published).`
607
375
  );
608
376
  return;
609
377
  }
@@ -612,9 +380,8 @@ export const buildCommand = defineCommand({
612
380
  // version control (Vercel's own CLI ignores `.vercel/` for the same reason).
613
381
  // Ignoring it is independent of whether the bundle had to be moved below:
614
382
  // Vercel writes straight to the project root, Netlify does not.
615
- const { adapter } = project.config.deployment;
616
- const ignoreDir = adapter ? ADAPTER_IGNORE_DIRS[adapter] : undefined;
617
- if (project.config.deployment.output === "server" && ignoreDir) {
383
+ const { ignoreDir } = platform.hiddenRuntime;
384
+ if (server && ignoreDir) {
618
385
  await ensureGitignore(root, [ignoreDir]);
619
386
  }
620
387
 
@@ -627,20 +394,10 @@ export const buildCommand = defineCommand({
627
394
  project.context
628
395
  );
629
396
  if (surfaced.moved) {
630
- logger.success(`Surfaced ${adapter} output to ${surfaced.to}`);
397
+ logger.success(`Surfaced ${deployment.kind} output to ${surfaced.to}`);
631
398
  }
632
399
 
633
- if (project.config.deployment.output === "server" && adapter === "vercel") {
634
- await checkVercelFunctionBundles(join(root, ".vercel", "output"), root);
635
- await emitVercelNegotiation(project, markdownRoutePaths(project), root);
636
- }
637
-
638
- if (
639
- project.config.deployment.output === "server" &&
640
- adapter === "cloudflare"
641
- ) {
642
- await emitCloudflareNegotiation(project, markdownRoutePaths(project));
643
- }
400
+ await finalize(false);
644
401
 
645
402
  await reportBuild(
646
403
  project,
@@ -48,6 +48,7 @@ export const checkCommand = defineCommand({
48
48
  root,
49
49
  runtimeDir,
50
50
  strict: args.strict,
51
+ strictOptIn: true,
51
52
  });
52
53
 
53
54
  const { outDir } = project.context;
@@ -8,6 +8,7 @@ import {
8
8
  refreshBlumeContent,
9
9
  showBlumeErrorOverlay,
10
10
  } from "../../astro/integration.ts";
11
+ import { BlumeError } from "../../core/diagnostics.ts";
11
12
  import { scanProject } from "../../core/project-graph.ts";
12
13
  import { resolveRuntimeDir } from "../../core/project.ts";
13
14
  import { parsePort } from "../args.ts";
@@ -18,6 +19,7 @@ import {
18
19
  DevLockHeldError,
19
20
  updateDevLockPort,
20
21
  } from "../dev-lock.ts";
22
+ import { refuseIfEjected } from "../eject-scripts.ts";
21
23
  import { normalizeHost } from "../host-args.ts";
22
24
  import { logger, reportDiagnostics } from "../log.ts";
23
25
  import { prepareProject } from "../prepare.ts";
@@ -36,6 +38,33 @@ const routeSignature = (
36
38
  .toSorted()
37
39
  .join("\n");
38
40
 
41
+ /**
42
+ * The port the dev server actually bound. Astro snapshots `address` when the
43
+ * server first listens, but a config restart that lands during startup leaves
44
+ * that snapshot null: the `astro.config.mjs` written just before the server
45
+ * started can reach Astro's watcher late, and Astro restarts in place before
46
+ * it ever listens. The live resolved URLs follow the restarted server, so read
47
+ * the port from those, then fall back to the one that was asked for.
48
+ */
49
+ const boundPortOf = (
50
+ server: Awaited<ReturnType<typeof dev>>,
51
+ requested: number
52
+ ): number => {
53
+ // SAFETY: Astro types `address` as always set, but it is null at runtime
54
+ // when a restart replaced the server before its first listen (see above).
55
+ const address = server.address as typeof server.address | null;
56
+ if (address) {
57
+ return address.port;
58
+ }
59
+ for (const url of server.resolvedUrls.local) {
60
+ const port = Number(new URL(url).port);
61
+ if (port > 0) {
62
+ return port;
63
+ }
64
+ }
65
+ return requested;
66
+ };
67
+
39
68
  export const devCommand = defineCommand({
40
69
  args: {
41
70
  "content-dir": {
@@ -58,6 +87,7 @@ export const devCommand = defineCommand({
58
87
  meta: commandMeta.dev,
59
88
  async run({ args }) {
60
89
  const root = process.cwd();
90
+ await refuseIfEjected(root, "dev");
61
91
  const preview = args.preview ?? false;
62
92
  const overrides = args["content-dir"]
63
93
  ? { contentRoot: args["content-dir"] }
@@ -117,7 +147,7 @@ export const devCommand = defineCommand({
117
147
  // second invocation tells its caller to reuse. The site fallback baked
118
148
  // into the runtime also carries the port, so it must follow suit (below,
119
149
  // once the regeneration closure exists).
120
- const boundPort = server.address.port;
150
+ const boundPort = boundPortOf(server, port);
121
151
  if (boundPort !== port) {
122
152
  updateDevLockPort(outDir, boundPort);
123
153
  devServerUrl = `http://localhost:${boundPort}`;
@@ -175,6 +205,15 @@ export const devCommand = defineCommand({
175
205
  reportDiagnostics(next.diagnostics, root);
176
206
  showBlumeErrorOverlay(next.diagnostics);
177
207
  } catch (error) {
208
+ // A config error the generator raised (an unplannable `components.ts`
209
+ // override, a missing font file) is a diagnostic: report it in the
210
+ // terminal and the browser overlay like a scan-time error, so the fix
211
+ // is visible where the edit happened.
212
+ if (error instanceof BlumeError) {
213
+ reportDiagnostics([error.diagnostic], root);
214
+ showBlumeErrorOverlay([error.diagnostic]);
215
+ return;
216
+ }
178
217
  // SAFETY: regeneration failures come from the generator and Astro's
179
218
  // server API, which raise Error instances; only the message is shown.
180
219
  logger.error(`Regeneration failed: ${(error as Error).message}`);