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