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,15 +1,24 @@
1
1
  import { readFileSync } from "node:fs";
2
+ import { readFile } from "node:fs/promises";
2
3
 
3
4
  import { defineCommand } from "citty";
4
5
  import { join } from "pathe";
5
6
  import { satisfies } from "semver";
6
7
 
8
+ import { discoverIslands } from "../../astro/islands.ts";
9
+ import { missingDependencyDiagnostic } from "../../astro/runtime-deps.ts";
10
+ import {
11
+ analyzeComponentOverrides,
12
+ ComponentOverridesError,
13
+ } from "../../core/component-overrides.ts";
7
14
  import { BlumeError } from "../../core/diagnostics.ts";
8
15
  import { packageRoot } from "../../core/package-root.ts";
9
16
  import { scanProject } from "../../core/project-graph.ts";
10
17
  import { serverFeatures } from "../../core/server-features.ts";
11
18
  import type { Diagnostic } from "../../core/types.ts";
19
+ import { unregisteredSnapshotDiagnostics } from "../../core/version-cut.ts";
12
20
  import { commandMeta } from "../command-meta.ts";
21
+ import { loadEnvFiles } from "../env.ts";
13
22
  import { reportInternalError } from "../internal-error.ts";
14
23
  import {
15
24
  flushStdout,
@@ -17,9 +26,36 @@ import {
17
26
  reportDiagnostics,
18
27
  reportDiagnosticsJson,
19
28
  } from "../log.ts";
29
+ import { checkRequiredSecrets } from "../required-secrets.ts";
20
30
 
21
31
  const FALLBACK_NODE_RANGE = ">=22.12.0";
22
32
 
33
+ /**
34
+ * Plan `components.ts` the way `blume dev`/`build` do, reporting each override
35
+ * that can't be planned — a non-static form, or an import of a file that
36
+ * doesn't exist — with its own line. The scan alone never reads the file, so
37
+ * without this doctor would pass a project whose build fails.
38
+ */
39
+ const componentsDiagnostics = async (
40
+ componentsFile: string | null
41
+ ): Promise<Diagnostic[]> => {
42
+ if (!componentsFile) {
43
+ return [];
44
+ }
45
+ try {
46
+ analyzeComponentOverrides(
47
+ await readFile(componentsFile, "utf-8"),
48
+ componentsFile
49
+ );
50
+ return [];
51
+ } catch (error) {
52
+ if (error instanceof ComponentOverridesError) {
53
+ return error.issues;
54
+ }
55
+ throw error;
56
+ }
57
+ };
58
+
23
59
  /** The supported Node range, read from the package's own `engines` field so
24
60
  * doctor can never drift from what the package actually declares. */
25
61
  const supportedNodeRange = (): string => {
@@ -56,33 +92,73 @@ export const doctorCommand = defineCommand({
56
92
  });
57
93
  }
58
94
 
95
+ // Read `.env` files first, as `blume dev`/`build` do: remote sources read
96
+ // their tokens during the scan, and the secrets check below reads them too.
97
+ loadEnvFiles(root);
98
+
59
99
  try {
60
100
  const project = await scanProject(root, { mode: "build" });
61
- diagnostics.push(...project.diagnostics);
101
+ diagnostics.push(
102
+ ...project.diagnostics,
103
+ ...unregisteredSnapshotDiagnostics(project)
104
+ );
62
105
 
63
106
  const { config } = project;
107
+ // The packages and secrets a build would need: an adapter's missing SDK
108
+ // fails the build, and a missing secret fails at the first request.
109
+ const { islands } = await discoverIslands(root);
110
+ const dependencies = await missingDependencyDiagnostic(
111
+ config,
112
+ root,
113
+ "error",
114
+ islands.map((island) => island.framework)
115
+ );
116
+ if (dependencies) {
117
+ diagnostics.push(dependencies);
118
+ }
119
+ diagnostics.push(
120
+ ...(await componentsDiagnostics(project.context.componentsFile)),
121
+ ...checkRequiredSecrets(config)
122
+ );
64
123
  const features = serverFeatures(config);
65
- if (features.length > 0 && config.deployment.output === "static") {
124
+ if (
125
+ features.length > 0 &&
126
+ config.deployment.options.output === "static"
127
+ ) {
128
+ // A host adapter already names the target, so only its
129
+ // `output: "static"` stands in the way; otherwise name one.
130
+ const { kind } = config.deployment;
66
131
  diagnostics.push({
67
132
  code: "BLUME_SERVER_FEATURE_REQUIRED",
68
- message: `${features.join(", ")} require server output.`,
69
- severity: "error",
70
- suggestion: 'Set deployment.output to "server".',
71
- });
72
- }
73
- if (config.deployment.output === "server" && !config.deployment.adapter) {
74
- diagnostics.push({
75
- code: "BLUME_ADAPTER_REQUIRED",
76
- message: "Server output requires an adapter.",
133
+ message: `${features.join(", ")} ${features.length === 1 ? "requires" : "require"} server output.`,
77
134
  severity: "error",
78
- suggestion: 'Set deployment.adapter (e.g. "vercel").',
135
+ suggestion:
136
+ kind === "static"
137
+ ? 'Set deployment to a host adapter from "blume/deploy" (e.g. `deployment: vercel()`).'
138
+ : `Drop \`output: "static"\` from \`deployment: ${kind}()\` to build for the server.`,
79
139
  });
80
140
  }
81
141
 
82
142
  if (!args.json) {
83
143
  logger.info(`Pages: ${project.graph.pages.length}`);
84
- logger.info(`Output: ${config.deployment.output}`);
85
- logger.info(`Search: ${config.search.provider}`);
144
+ logger.info(`Output: ${config.deployment.options.output}`);
145
+ logger.info(`Adapter: ${config.deployment.kind}`);
146
+ logger.info(`Search: ${config.search.provider.kind}`);
147
+ logger.info(
148
+ `References: ${config.reference.map((adapter) => adapter.kind).join(", ") || "none"}`
149
+ );
150
+ logger.info(
151
+ `Analytics: ${config.analytics.map((adapter) => adapter.kind).join(", ") || "none"}`
152
+ );
153
+ logger.info(
154
+ `Sources: ${config.content.sources.map((source) => source.kind).join(", ")}`
155
+ );
156
+ const { ask } = config.ai;
157
+ let askSummary = "off";
158
+ if (ask?.enabled) {
159
+ askSummary = ask.endpoint ? "external endpoint" : ask.provider.kind;
160
+ }
161
+ logger.info(`Ask AI: ${askSummary}`);
86
162
  }
87
163
  } catch (error) {
88
164
  if (error instanceof BlumeError) {
@@ -1,15 +1,39 @@
1
1
  import { defineCommand } from "citty";
2
2
  import { relative } from "pathe";
3
3
 
4
+ import { BlumeError } from "../../core/diagnostics.ts";
4
5
  import { eject } from "../../registry/eject.ts";
5
6
  import { commandMeta } from "../command-meta.ts";
6
7
  import { refuseIfDevRunning } from "../dev-lock.ts";
7
- import { updatePackageScripts } from "../eject-scripts.ts";
8
+ import { isEjectedProject, updatePackageScripts } from "../eject-scripts.ts";
8
9
  import { commandsFor, detectProjectPackageManager } from "../init/scaffold.ts";
9
- import { logger } from "../log.ts";
10
+ import { logger, reportDiagnostics } from "../log.ts";
11
+
12
+ /**
13
+ * Eject the project, reporting a config or `components.ts` error as the same
14
+ * diagnostic other commands print (a Blume 1 config, say) instead of a stack.
15
+ */
16
+ const ejectOrExit = async (
17
+ root: string
18
+ ): Promise<Awaited<ReturnType<typeof eject>>> => {
19
+ try {
20
+ return await eject(root);
21
+ } catch (error) {
22
+ if (error instanceof BlumeError) {
23
+ reportDiagnostics([error.diagnostic], root);
24
+ process.exit(1);
25
+ }
26
+ throw error;
27
+ }
28
+ };
10
29
 
11
30
  export const ejectCommand = defineCommand({
12
31
  args: {
32
+ force: {
33
+ description:
34
+ "Eject again over an already-ejected app, overwriting astro.config.mjs and src/.",
35
+ type: "boolean",
36
+ },
13
37
  yes: { description: "Skip the confirmation prompt.", type: "boolean" },
14
38
  },
15
39
  meta: commandMeta.eject,
@@ -17,16 +41,25 @@ export const ejectCommand = defineCommand({
17
41
  const root = process.cwd();
18
42
  refuseIfDevRunning(root, "ejecting");
19
43
 
44
+ // A second eject rewrites the app from blume.config.ts, discarding every
45
+ // edit made to it since the first, so it takes an explicit --force.
46
+ if (isEjectedProject(root) && !args.force) {
47
+ logger.error(
48
+ "This project is already ejected: ejecting again would overwrite astro.config.mjs and src/ with a fresh copy, discarding your edits to them. Pass --force to overwrite them anyway."
49
+ );
50
+ process.exit(1);
51
+ }
52
+
20
53
  if (!args.yes) {
21
54
  logger.warn(
22
- "Eject is one-way: it writes astro.config.mjs, src/, and (if absent) tsconfig.json, rewrites your package.json scripts, and removes .blume. An existing tsconfig.json is left untouched."
55
+ "Eject is one-way: it writes astro.config.mjs, src/, and (if absent) tsconfig.json, rewrites your package.json scripts, adds the packages the Astro app imports to its dependencies, and removes .blume. An existing tsconfig.json is left untouched."
23
56
  );
24
57
  logger.info("Re-run with --yes to proceed.");
25
58
  return;
26
59
  }
27
60
 
28
- const { files, warnings } = await eject(root);
29
- await updatePackageScripts(root);
61
+ const { dependencies, files, warnings } = await ejectOrExit(root);
62
+ const added = await updatePackageScripts(root, dependencies);
30
63
 
31
64
  // The same surface as the generated-runtime path (prepare.ts): one warn
32
65
  // per generation warning, e.g. a Scalar reference spec that wasn't found.
@@ -41,9 +74,13 @@ export const ejectCommand = defineCommand({
41
74
  // Print run commands matching the project's package manager (lockfile
42
75
  // detection, since eject runs inside an existing project).
43
76
  const pm = await detectProjectPackageManager(root);
44
- const { build, dev } = commandsFor(pm);
77
+ const { build, dev, install } = commandsFor(pm);
78
+ // Newly added dependencies aren't installed yet, so install comes first.
79
+ const run = added.length > 0 ? [install, dev, build] : [dev, build];
80
+ const addedNote =
81
+ added.length > 0 ? `Added to package.json: ${added.join(", ")}.\n\n` : "";
45
82
  logger.box(
46
- `Your project is now a standalone Astro app.\n\n ${dev}\n ${build}\n\nThe blume package remains importable.`
83
+ `Your project is now a standalone Astro app.\n\n${addedNote}${run.map((command) => ` ${command}`).join("\n")}\n\nThe blume package remains importable.`
47
84
  );
48
85
  },
49
86
  });
@@ -24,7 +24,7 @@ import type { EvalResult } from "../../eval/run.ts";
24
24
  import { EvalsFileError, loadEvalsFile } from "../../eval/schema.ts";
25
25
  import { commandMeta } from "../command-meta.ts";
26
26
  import { reportInternalError } from "../internal-error.ts";
27
- import { flushStdout, logger } from "../log.ts";
27
+ import { flushStdout, logger, reportDiagnostics } from "../log.ts";
28
28
 
29
29
  const DEFAULT_FILE = "evals.yaml";
30
30
 
@@ -232,7 +232,7 @@ export const evalCommand = defineCommand({
232
232
  process.exit(1);
233
233
  }
234
234
  if (error instanceof BlumeError) {
235
- logger.error(error.diagnostic.message);
235
+ reportDiagnostics([error.diagnostic], root);
236
236
  process.exit(1);
237
237
  }
238
238
  // SAFETY: only the `code` tag is inspected; a spawn failure throws an
@@ -6,6 +6,7 @@ import { ensureGitignore } from "../../core/gitignore.ts";
6
6
  import { eject } from "../../registry/eject.ts";
7
7
  import { commandMeta } from "../command-meta.ts";
8
8
  import { updatePackageScripts } from "../eject-scripts.ts";
9
+ import { installDependencies } from "../init/install.ts";
9
10
  import { collectAnswers } from "../init/questions.ts";
10
11
  import {
11
12
  applyPlan,
@@ -14,48 +15,160 @@ import {
14
15
  detectPackageManager,
15
16
  nextSteps,
16
17
  PACKAGE_MANAGERS,
18
+ readExistingPackage,
17
19
  TEMPLATES,
18
20
  validateContentDir,
21
+ workspaceNote,
19
22
  } from "../init/scaffold.ts";
20
23
  import type { InitAnswers } from "../init/scaffold.ts";
21
24
  import { logger } from "../log.ts";
22
25
 
26
+ /** The `cd` line that opens every next-steps hint, when one is needed. */
27
+ const cdStep = (answers: InitAnswers): string[] =>
28
+ answers.directory === "." ? [] : [`cd ${answers.directory}`];
29
+
30
+ /**
31
+ * Install the scaffolded project's dependencies. Interactive runs hide the
32
+ * package manager's output behind a spinner; `--yes`/CI runs stream it. On
33
+ * failure the scaffold is left intact and the exact retry command is printed
34
+ * before exiting non-zero, so a CI wrapper can tell the two outcomes apart.
35
+ */
36
+ const installScaffold = async (
37
+ root: string,
38
+ answers: InitAnswers,
39
+ interactive: boolean
40
+ ): Promise<void> => {
41
+ const command = commandsFor(answers.packageManager).install;
42
+ const spinner = interactive ? clack.spinner() : undefined;
43
+ if (spinner) {
44
+ spinner.start(`Installing dependencies (${command})`);
45
+ } else {
46
+ logger.info(`Installing dependencies (${command})…`);
47
+ }
48
+ const outcome = await installDependencies(root, answers.packageManager, {
49
+ quiet: interactive,
50
+ });
51
+ if (outcome.failure === undefined) {
52
+ if (spinner) {
53
+ spinner.stop("Installed dependencies");
54
+ } else {
55
+ logger.success("Installed dependencies");
56
+ }
57
+ return;
58
+ }
59
+ const retry = [...cdStep(answers), command];
60
+ const hint = `Project created successfully, but dependency installation failed.\n\nRetry with:\n\n ${retry.join("\n ")}\n`;
61
+ if (spinner) {
62
+ spinner.stop("Dependency installation failed");
63
+ clack.log.error(outcome.failure);
64
+ clack.note(hint.trimEnd());
65
+ clack.outro("Scaffolded without dependencies.");
66
+ } else {
67
+ logger.error(outcome.failure);
68
+ logger.box(hint.trimEnd());
69
+ }
70
+ process.exit(1);
71
+ };
72
+
23
73
  /**
24
74
  * Eject the freshly scaffolded project, or print the install-then-eject path.
25
75
  * Eject jiti-loads the scaffolded blume.config.ts, whose `import { defineConfig }
26
76
  * from "blume"` only resolves once dependencies are installed (or blume is
27
- * hoisted from an ancestor node_modules, as in a monorepo) — so on a fresh
28
- * scaffold the fallback below is the common path.
77
+ * hoisted from an ancestor node_modules, as in a monorepo) — so the fallback
78
+ * below is the common path when the install step was skipped.
29
79
  */
30
80
  const ejectScaffold = async (
31
81
  root: string,
32
- answers: InitAnswers
82
+ answers: InitAnswers,
83
+ needsInstall: boolean
33
84
  ): Promise<void> => {
34
85
  const commands = commandsFor(answers.packageManager);
35
- const cd = answers.directory === "." ? [] : [`cd ${answers.directory}`];
86
+ const cd = cdStep(answers);
87
+ const install = needsInstall ? [commands.install] : [];
36
88
  try {
37
- await eject(root);
89
+ const { dependencies } = await eject(root);
38
90
  // The scaffolded scripts point at the Blume CLI; the ejected app runs
39
91
  // Astro directly (mirroring the standalone `blume eject` command).
40
- await updatePackageScripts(root);
92
+ const added = await updatePackageScripts(root, dependencies);
41
93
  logger.success("Ejected to a standalone Astro project.");
42
- const steps = [...cd, commands.install, commands.dev];
43
- logger.box(`Next steps:\n\n ${steps.join("\n ")}\n`);
94
+ // The packages eject added aren't installed yet, even when the scaffold's
95
+ // own install already ran, so install comes first either way.
96
+ const ejectInstall = added.length > 0 ? [commands.install] : install;
97
+ const steps = [...cd, ...ejectInstall, commands.dev];
98
+ logger.box(`Next steps:\n\n ${steps.join("\n ")}`);
44
99
  } catch (error) {
45
100
  // SAFETY: eject and the script rewrite throw Error instances; only the
46
101
  // message is surfaced in the fallback hint.
47
102
  logger.warn(
48
103
  `Scaffolded, but eject needs the project's dependencies installed to load blume.config.ts: ${(error as Error).message}`
49
104
  );
50
- const steps = [
51
- ...cd,
52
- commands.install,
53
- `${commands.exec} blume eject --yes`,
54
- ];
55
- logger.box(`Next steps:\n\n ${steps.join("\n ")}\n`);
105
+ const steps = [...cd, ...install, `${commands.exec} blume eject --yes`];
106
+ logger.box(`Next steps:\n\n ${steps.join("\n ")}`);
56
107
  }
57
108
  };
58
109
 
110
+ /**
111
+ * Print the closing next steps. An existing package.json was left alone, so
112
+ * the steps add what it lacks; a workspace `note` already printed ahead of an
113
+ * install that ran, so it closes the steps only when the install is still the
114
+ * user's to run.
115
+ */
116
+ const printNextSteps = async (
117
+ root: string,
118
+ answers: InitAnswers,
119
+ outcome: {
120
+ createdPackage: boolean;
121
+ interactive: boolean;
122
+ needsInstall: boolean;
123
+ note: string | undefined;
124
+ }
125
+ ): Promise<void> => {
126
+ const existing = outcome.createdPackage
127
+ ? undefined
128
+ : await readExistingPackage(root);
129
+ const steps = nextSteps(
130
+ answers,
131
+ outcome.needsInstall,
132
+ existing,
133
+ outcome.needsInstall ? outcome.note : undefined
134
+ );
135
+ if (outcome.interactive) {
136
+ clack.note(steps.trimEnd());
137
+ clack.outro("You're all set.");
138
+ } else {
139
+ // consola's box pads its content itself; a trailing newline would add
140
+ // blank rows at the bottom.
141
+ logger.box(steps.trimEnd());
142
+ }
143
+ };
144
+
145
+ /**
146
+ * Validate the enum-valued flags up front, exiting with the accepted values
147
+ * on a typo so a bad flag never reaches the prompts.
148
+ */
149
+ const resolveFlags = (args: {
150
+ "package-manager"?: string;
151
+ template?: string;
152
+ }) => {
153
+ const template = TEMPLATES.find((candidate) => candidate === args.template);
154
+ if (args.template !== undefined && template === undefined) {
155
+ logger.error(
156
+ `Unknown template "${args.template}" (use ${TEMPLATES.join(" | ")}).`
157
+ );
158
+ process.exit(1);
159
+ }
160
+ const pm = PACKAGE_MANAGERS.find(
161
+ (candidate) => candidate === args["package-manager"]
162
+ );
163
+ if (args["package-manager"] !== undefined && pm === undefined) {
164
+ logger.error(
165
+ `Unknown package manager "${args["package-manager"]}" (use ${PACKAGE_MANAGERS.join(" | ")}).`
166
+ );
167
+ process.exit(1);
168
+ }
169
+ return { pm, template };
170
+ };
171
+
59
172
  export const initCommand = defineCommand({
60
173
  args: {
61
174
  "content-dir": {
@@ -71,9 +184,15 @@ export const initCommand = defineCommand({
71
184
  description: "Eject to a standalone Astro project after scaffolding.",
72
185
  type: "boolean",
73
186
  },
187
+ install: {
188
+ default: true,
189
+ description: "Install dependencies after scaffolding.",
190
+ negativeDescription: "Skip installing dependencies after scaffolding.",
191
+ type: "boolean",
192
+ },
74
193
  "package-manager": {
75
194
  description:
76
- "Package manager for the next-steps hint (npm|pnpm|yarn|bun).",
195
+ "Package manager to install with and print in the next steps (npm|pnpm|yarn|bun).",
77
196
  type: "string",
78
197
  },
79
198
  template: {
@@ -88,23 +207,7 @@ export const initCommand = defineCommand({
88
207
  meta: commandMeta.init,
89
208
  async run({ args }) {
90
209
  const cwd = process.cwd();
91
-
92
- const template = TEMPLATES.find((candidate) => candidate === args.template);
93
- if (args.template !== undefined && template === undefined) {
94
- logger.error(
95
- `Unknown template "${args.template}" (use ${TEMPLATES.join(" | ")}).`
96
- );
97
- process.exit(1);
98
- }
99
- const pm = PACKAGE_MANAGERS.find(
100
- (candidate) => candidate === args["package-manager"]
101
- );
102
- if (args["package-manager"] !== undefined && pm === undefined) {
103
- logger.error(
104
- `Unknown package manager "${args["package-manager"]}" (use ${PACKAGE_MANAGERS.join(" | ")}).`
105
- );
106
- process.exit(1);
107
- }
210
+ const { pm, template } = resolveFlags(args);
108
211
 
109
212
  const interactive =
110
213
  !args.yes &&
@@ -153,7 +256,14 @@ export const initCommand = defineCommand({
153
256
  }
154
257
 
155
258
  const sink = interactive ? clack.log : logger;
156
- const { createdPackage } = await applyPlan(buildPlan(root, answers), sink);
259
+ const env = { userAgent: process.env.npm_config_user_agent };
260
+ const { createdPackage } = await applyPlan(
261
+ buildPlan(root, answers, env),
262
+ sink
263
+ );
264
+ // A workspace the project joins keeps its own package-manager config,
265
+ // which `init` leaves alone; say what it still needs before installing.
266
+ const note = workspaceNote(root, answers, env);
157
267
 
158
268
  // Keep installed dependencies, Blume's generated runtime (`.blume/`), and
159
269
  // build output (`dist/`) out of version control. Idempotent: creates
@@ -168,17 +278,27 @@ export const initCommand = defineCommand({
168
278
  sink.success(`Added ${ignored.join(", ")} to .gitignore`);
169
279
  }
170
280
 
281
+ // A newly written package.json is the only one `init` knows lists blume;
282
+ // an existing one is left alone, and so are its dependencies.
283
+ const shouldInstall = createdPackage && args.install;
284
+ if (note) {
285
+ (interactive ? clack.log : logger).warn(note);
286
+ }
287
+ if (shouldInstall) {
288
+ await installScaffold(root, answers, interactive);
289
+ }
290
+ const needsInstall = createdPackage && !shouldInstall;
291
+
171
292
  if (args.eject) {
172
- await ejectScaffold(root, answers);
293
+ await ejectScaffold(root, answers, needsInstall);
173
294
  return;
174
295
  }
175
296
 
176
- const steps = nextSteps(answers, createdPackage);
177
- if (interactive) {
178
- clack.note(steps.trimEnd());
179
- clack.outro("You're all set.");
180
- } else {
181
- logger.box(steps);
182
- }
297
+ await printNextSteps(root, answers, {
298
+ createdPackage,
299
+ interactive,
300
+ needsInstall,
301
+ note,
302
+ });
183
303
  },
184
304
  });
@@ -0,0 +1,121 @@
1
+ import { defineCommand } from "citty";
2
+ import { join } from "pathe";
3
+
4
+ import { AGENTS, launchInstalledAgent } from "../../audit/agent.ts";
5
+ import type { AgentKind } from "../../audit/agent.ts";
6
+ import { packageRoot } from "../../core/package-root.ts";
7
+ import { getBlumeVersion } from "../../core/version.ts";
8
+ import {
9
+ MIGRATE_SKILL_DIR,
10
+ MIGRATE_SOURCES,
11
+ MIGRATE_SOURCE_NAMES,
12
+ detectMigrateSource,
13
+ isMigrateSource,
14
+ migratePrompt,
15
+ } from "../../migrate/migrate.ts";
16
+ import type { MigrateSourceId } from "../../migrate/migrate.ts";
17
+ import { commandMeta } from "../command-meta.ts";
18
+ import { reportInternalError } from "../internal-error.ts";
19
+ import { logger } from "../log.ts";
20
+
21
+ /**
22
+ * `blume migrate [source]` — move a docs site from another framework to Blume
23
+ * with a coding agent. Run it through the package runner (`npx blume migrate
24
+ * fumadocs --claude`) in the site being migrated: it names the source (or
25
+ * detects it), then opens Claude Code or Codex on the `blume-migrate` skill
26
+ * bundled in this package, the way `blume audit --claude` hands off its
27
+ * findings. The judgment stays in the skill; the command is the front door.
28
+ * Status lines go straight to stderr: consola drops info-level lines in test
29
+ * and CI environments.
30
+ */
31
+ export const migrateCommand = defineCommand({
32
+ args: {
33
+ claude: {
34
+ description: "Run the migration with Claude Code.",
35
+ type: "boolean",
36
+ },
37
+ codex: {
38
+ description: "Run the migration with Codex.",
39
+ type: "boolean",
40
+ },
41
+ source: {
42
+ description: `The framework to migrate from: ${MIGRATE_SOURCES.join(" | ")}. Detected when omitted.`,
43
+ required: false,
44
+ type: "positional",
45
+ },
46
+ },
47
+ meta: commandMeta.migrate,
48
+ async run({ args }) {
49
+ const root = process.cwd();
50
+ // SAFETY: AGENTS is a closed record keyed by AgentKind, so its keys are
51
+ // exactly the agent kinds.
52
+ const agents = (Object.keys(AGENTS) as AgentKind[]).filter(
53
+ (kind) => args[kind]
54
+ );
55
+ if (agents.length > 1) {
56
+ logger.error("Pass at most one of --claude or --codex.");
57
+ process.exit(1);
58
+ }
59
+ const [agent] = agents;
60
+ if (args.source && !isMigrateSource(args.source)) {
61
+ logger.error(
62
+ `Unknown source "${args.source}" (use ${MIGRATE_SOURCES.join(" | ")}). Leave it out to detect the framework, or to migrate from one not listed.`
63
+ );
64
+ process.exit(1);
65
+ }
66
+
67
+ try {
68
+ const detected = await detectMigrateSource(root);
69
+ const named: MigrateSourceId | null =
70
+ args.source && isMigrateSource(args.source) ? args.source : null;
71
+ const source = named ?? detected?.source ?? null;
72
+ process.stderr.write(
73
+ source
74
+ ? ` Migrating from ${MIGRATE_SOURCE_NAMES[source]}${named ? "" : ` (detected from ${detected?.evidence})`}.\n`
75
+ : " Couldn't detect the docs framework; the agent will inventory the repo first.\n"
76
+ );
77
+ // A named source wins, but a repo that looks like another framework is
78
+ // worth a second look before an agent rewrites it on the wrong mappings.
79
+ if (named && detected && detected.source !== named) {
80
+ process.stderr.write(
81
+ ` Warning: this looks like a ${MIGRATE_SOURCE_NAMES[detected.source]} project (${detected.evidence}); migrating from ${MIGRATE_SOURCE_NAMES[named]} as named.\n`
82
+ );
83
+ }
84
+ const skillDir = join(packageRoot(), MIGRATE_SKILL_DIR);
85
+
86
+ // Without an agent flag the command is the pointer for any other agent:
87
+ // the bundled skill's path (which lives in a throwaway cache under npx),
88
+ // plus the install line that puts the skill where agents look for it.
89
+ if (!agent) {
90
+ process.stderr.write(
91
+ ` blume migrate runs the migration with a coding agent: rerun with --claude or --codex.\n Using another agent? Point it at ${join(skillDir, "SKILL.md")},\n or install the skill where your agent looks for skills: npx skills add haydenbleasel/blume --skill blume-migrate\n`
92
+ );
93
+ return;
94
+ }
95
+
96
+ const cli = AGENTS[agent];
97
+ process.stderr.write(` Handing the migration to ${cli.name}…\n\n`);
98
+ const code = await launchInstalledAgent(
99
+ cli.bin,
100
+ migratePrompt({
101
+ detected,
102
+ skillDir,
103
+ source,
104
+ version: getBlumeVersion(),
105
+ })
106
+ );
107
+ if (code === null) {
108
+ logger.error(
109
+ `${cli.name} (\`${cli.bin}\`) was not found on PATH. Install it with \`${cli.install}\`.`
110
+ );
111
+ process.exit(1);
112
+ }
113
+ if (code !== 0) {
114
+ process.exit(code);
115
+ }
116
+ } catch (error) {
117
+ reportInternalError(error);
118
+ process.exit(1);
119
+ }
120
+ },
121
+ });
@@ -6,6 +6,7 @@ import { join } from "pathe";
6
6
 
7
7
  import { loadConfig } from "../../core/config.ts";
8
8
  import { resolveProjectContext } from "../../core/project.ts";
9
+ import { deployOutputDir } from "../../deploy/adapter-output.ts";
9
10
  import { parsePort } from "../args.ts";
10
11
  import { commandMeta } from "../command-meta.ts";
11
12
  import { normalizeHost } from "../host-args.ts";
@@ -22,7 +23,12 @@ export const previewCommand = defineCommand({
22
23
  const { config } = await loadConfig(root);
23
24
  const context = resolveProjectContext(root, config);
24
25
 
25
- if (!existsSync(join(context.outDir, "astro.config.mjs"))) {
26
+ // `blume dev` writes `.blume/astro.config.mjs` too, so the runtime alone
27
+ // doesn't mean there's anything to serve: the build output must exist.
28
+ if (
29
+ !existsSync(join(context.outDir, "astro.config.mjs")) ||
30
+ !existsSync(deployOutputDir(config, context))
31
+ ) {
26
32
  logger.error("No build found. Run `blume build` first.");
27
33
  process.exit(1);
28
34
  }