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
@@ -0,0 +1,499 @@
1
+ import { existsSync } from "node:fs";
2
+ import { readFile, writeFile } from "node:fs/promises";
3
+
4
+ import { join, relative, resolve } from "pathe";
5
+ import { glob } from "tinyglobby";
6
+ import { z } from "zod";
7
+
8
+ import {
9
+ analyzeComponentOverrides,
10
+ ComponentOverridesError,
11
+ } from "../core/component-overrides.ts";
12
+ import { ConfigValidationError, loadConfig } from "../core/config.ts";
13
+ import { BlumeError, locateFrontmatterKey } from "../core/diagnostics.ts";
14
+ import matter from "../core/frontmatter.ts";
15
+ import { createModuleLoader } from "../core/load-module.ts";
16
+ import { findComponentsFile, findConfigFile } from "../core/project.ts";
17
+ import { pageMetaSchema } from "../core/schema.ts";
18
+ import { baselineScanIgnore } from "../core/sources/watch.ts";
19
+ import type { Diagnostic } from "../core/types.ts";
20
+ import {
21
+ DEFAULT_CONTENT_EXCLUDE,
22
+ DEFAULT_CONTENT_INCLUDE,
23
+ } from "../sources/filesystem.ts";
24
+
25
+ /**
26
+ * `blume upgrade`'s logic, kept out of the command module so it runs (and is
27
+ * covered) in-process: bump the `blume` dependency to the running CLI's major,
28
+ * then check the project against it — the config through the same loader
29
+ * every command uses, which names each removed or renamed field and its
30
+ * replacement, `components.ts` through the same static planner the build
31
+ * runs, and each page's front matter for fields the schema removed. The
32
+ * command prints the findings or hands them to a coding agent.
33
+ */
34
+
35
+ /** The upgrade guide's route on the Blume docs site. */
36
+ export const UPGRADE_GUIDE_URL = "https://useblume.dev/docs/upgrading";
37
+
38
+ /** The upgrade guide's file inside the published package's bundled docs. */
39
+ export const UPGRADE_GUIDE_FILE = join("docs", "03-upgrading.mdx");
40
+
41
+ /** What `bumpBlumeDependency` did to `package.json`. */
42
+ export type DependencyBump =
43
+ | {
44
+ field: DependencyField;
45
+ from: string;
46
+ status: "bumped";
47
+ to: string;
48
+ }
49
+ | { range: string; status: "current" }
50
+ | { status: "missing" };
51
+
52
+ type DependencyField = "dependencies" | "devDependencies";
53
+
54
+ const DEPENDENCY_FIELDS: DependencyField[] = [
55
+ "dependencies",
56
+ "devDependencies",
57
+ ];
58
+
59
+ /** The slice of `package.json` the bump reads and rewrites. */
60
+ interface PackageJson {
61
+ dependencies?: Record<string, string>;
62
+ devDependencies?: Record<string, string>;
63
+ }
64
+
65
+ // Leading comparators and a `v` may precede the major (`^1.7.3`, `>=1 <2`,
66
+ // `v1`); a protocol (`workspace:`, `file:`, `npm:`) or a tag (`latest`) names
67
+ // no major at all, and those ranges are left to the user.
68
+ const RANGE_MAJOR = /^[\s<=>^~v]*(?<major>\d+)/u;
69
+
70
+ /** The major version a dependency range pins, or null when it names none. */
71
+ export const rangeMajor = (range: string): number | null => {
72
+ const major = RANGE_MAJOR.exec(range)?.groups?.major;
73
+ return major === undefined ? null : Number(major);
74
+ };
75
+
76
+ // The file's own indentation (two spaces, four, or a tab), so a fallback
77
+ // rewrite doesn't reformat a package.json the user keeps differently.
78
+ const INDENT = /^(?<indent>[ \t]+)"/mu;
79
+
80
+ const REGEXP_SPECIAL = /[$()*+.?[\\\]^{|}]/gu;
81
+ const escapeRegExp = (value: string): string =>
82
+ value.replaceAll(REGEXP_SPECIAL, String.raw`\$&`);
83
+
84
+ /**
85
+ * `text` with the `blume` range under `field` replaced in place, so the file
86
+ * keeps its own formatting, key order, and inline objects; null when the entry
87
+ * isn't written the plain way (an escaped key or value).
88
+ */
89
+ const replaceRange = (
90
+ text: string,
91
+ field: DependencyField,
92
+ from: string,
93
+ to: string
94
+ ): string | null => {
95
+ const value = JSON.stringify(from);
96
+ const entry = new RegExp(`"blume"\\s*:\\s*${escapeRegExp(value)}`, "gu");
97
+ entry.lastIndex = Math.max(text.indexOf(JSON.stringify(field)), 0);
98
+ const match = entry.exec(text);
99
+ if (!match) {
100
+ return null;
101
+ }
102
+ const end = match.index + match[0].length;
103
+ return `${text.slice(0, end - value.length)}${JSON.stringify(to)}${text.slice(end)}`;
104
+ };
105
+
106
+ /**
107
+ * Point `package.json`'s `blume` dependency at `^version` when it pins an
108
+ * older major. A range already on this major, or one that names no version
109
+ * (`workspace:*`, `latest`), is reported as current and left alone; a
110
+ * project with no `package.json`, or none that lists `blume`, is `missing`.
111
+ * Only the range changes: the rest of the file is kept byte for byte.
112
+ */
113
+ export const bumpBlumeDependency = async (
114
+ root: string,
115
+ version: string
116
+ ): Promise<DependencyBump> => {
117
+ const path = join(root, "package.json");
118
+ if (!existsSync(path)) {
119
+ return { status: "missing" };
120
+ }
121
+ const text = await readFile(path, "utf-8");
122
+ // SAFETY: package.json is a JSON object; only its dependency maps, which
123
+ // map package names to range strings, are read.
124
+ const pkg = JSON.parse(text) as PackageJson;
125
+ const field = DEPENDENCY_FIELDS.find(
126
+ (name) => pkg[name]?.blume !== undefined
127
+ );
128
+ const from = field ? pkg[field]?.blume : undefined;
129
+ if (!(field && from)) {
130
+ return { status: "missing" };
131
+ }
132
+ const current = rangeMajor(from);
133
+ const target = rangeMajor(version);
134
+ if (current === null || target === null || current >= target) {
135
+ return { range: from, status: "current" };
136
+ }
137
+ const to = `^${version}`;
138
+ const indent = INDENT.exec(text)?.groups?.indent ?? " ";
139
+ const updated = { ...pkg, [field]: { ...pkg[field], blume: to } };
140
+ await writeFile(
141
+ path,
142
+ replaceRange(text, field, from, to) ??
143
+ `${JSON.stringify(updated, null, indent)}\n`
144
+ );
145
+ return { field, from, status: "bumped", to };
146
+ };
147
+
148
+ /**
149
+ * Whether `root` is no Blume project at all: no config file and no `blume`
150
+ * dependency, so the upgrade would only check the defaults and report the
151
+ * folder ready. A zero-config project still lists `blume`.
152
+ */
153
+ export const isOutsideBlumeProject = (
154
+ root: string,
155
+ bump: DependencyBump
156
+ ): boolean => bump.status === "missing" && findConfigFile(root) === null;
157
+
158
+ // ---------------------------------------------------------------------------
159
+ // Removed `blume build` flags
160
+ // ---------------------------------------------------------------------------
161
+
162
+ /** A `blume build` flag Blume 2 removed, bare or with an `=value`. */
163
+ const REMOVED_BUILD_FLAG = /^--(?<flag>adapter|base|output)(?:=|$)/u;
164
+
165
+ /** The removed `blume build` flags among `args`, in order, each once. */
166
+ export const removedBuildFlags = (args: readonly string[]): string[] => [
167
+ ...new Set(
168
+ args.flatMap((arg) => {
169
+ const flag = REMOVED_BUILD_FLAG.exec(arg)?.groups?.flag;
170
+ return flag ? [flag] : [];
171
+ })
172
+ ),
173
+ ];
174
+
175
+ /** The flags as the reader typed them: `--adapter, --output`. */
176
+ export const flagList = (flags: string[]): string =>
177
+ flags.map((flag) => `--${flag}`).join(", ");
178
+
179
+ /** What replaces each removed flag: the `deployment` config. */
180
+ export const removedBuildFlagsAdvice = (flags: string[]): string => {
181
+ const advice: string[] = [];
182
+ if (flags.includes("adapter") || flags.includes("output")) {
183
+ advice.push(
184
+ 'name the host in blume.config.ts with `deployment: vercel()` (or `netlify()`, `cloudflare()`, `node()`) from "blume/deploy" — a host adapter builds for the server, and `output: "static"` keeps it static'
185
+ );
186
+ }
187
+ if (flags.includes("base")) {
188
+ advice.push(
189
+ 'set the subpath with `deployment: { base: "/docs" }`, or the host adapter\'s `base` option'
190
+ );
191
+ }
192
+ return `Drop ${flagList(flags)} and ${advice.join("; ")}.`;
193
+ };
194
+
195
+ // A command that runs the Blume CLI: the bare bin, a versioned package
196
+ // (`blume@2`), or a path to it (`./node_modules/.bin/blume`).
197
+ const BLUME_BIN = /(?:^|[/\\])blume(?:@\S+)?$/u;
198
+ const COMMAND_SEPARATOR = /&&|\|\||[;|]/u;
199
+ const WHITESPACE = /\s+/u;
200
+
201
+ /** The arguments each `blume build` in a script passes, flattened. */
202
+ const buildArgs = (script: string): string[] =>
203
+ script.split(COMMAND_SEPARATOR).flatMap((command) => {
204
+ const words = command.trim().split(WHITESPACE);
205
+ const at = words.findIndex(
206
+ (word, index) => BLUME_BIN.test(word) && words[index + 1] === "build"
207
+ );
208
+ return at === -1 ? [] : words.slice(at + 2);
209
+ });
210
+
211
+ /** The slice of package.json the script check reads. */
212
+ const scriptsSchema = z.looseObject({
213
+ scripts: z.record(z.string(), z.string()).default({}),
214
+ });
215
+
216
+ const lineOf = (text: string, index: number): number =>
217
+ text.slice(0, index).split("\n").length;
218
+
219
+ /**
220
+ * A finding for each package.json script that still passes a removed flag to
221
+ * `blume build` — it would otherwise build a static site without a word.
222
+ */
223
+ const scriptFindings = async (root: string): Promise<Diagnostic[]> => {
224
+ const path = join(root, "package.json");
225
+ if (!existsSync(path)) {
226
+ return [];
227
+ }
228
+ const text = await readFile(path, "utf-8");
229
+ const pkg = scriptsSchema.safeParse(JSON.parse(text));
230
+ const scripts = pkg.success ? pkg.data.scripts : {};
231
+ const scriptsAt = text.indexOf('"scripts"');
232
+ return Object.entries(scripts).flatMap(([name, script]) => {
233
+ const flags = removedBuildFlags(buildArgs(script));
234
+ if (flags.length === 0) {
235
+ return [];
236
+ }
237
+ const at = text.indexOf(JSON.stringify(name), scriptsAt);
238
+ return [
239
+ {
240
+ code: "BLUME_BUILD_FLAG_REMOVED",
241
+ file: path,
242
+ line: at === -1 ? undefined : lineOf(text, at),
243
+ message: `The "${name}" script passes ${flagList(flags)} to \`blume build\`, which Blume 2 removed.`,
244
+ severity: "error",
245
+ suggestion: removedBuildFlagsAdvice(flags),
246
+ } satisfies Diagnostic,
247
+ ];
248
+ });
249
+ };
250
+
251
+ // ---------------------------------------------------------------------------
252
+ // Removed front matter fields
253
+ // ---------------------------------------------------------------------------
254
+
255
+ /** Where a project's local content lives, as its config names it. */
256
+ interface ContentGlobs {
257
+ exclude: string[];
258
+ include: string[];
259
+ root: string;
260
+ }
261
+
262
+ const globFields = {
263
+ exclude: z.array(z.string()).optional(),
264
+ include: z.array(z.string()).optional(),
265
+ root: z.string().optional(),
266
+ };
267
+
268
+ /**
269
+ * A filesystem source in either form a config being upgraded may hold: the
270
+ * `filesystem()` descriptor, or Blume 1's `{ type: "filesystem" }` object.
271
+ */
272
+ const rawFilesystemSourceSchema = z.union([
273
+ z
274
+ .looseObject({
275
+ kind: z.literal("filesystem"),
276
+ options: z.looseObject(globFields).default({}),
277
+ })
278
+ .transform((source) => source.options),
279
+ z.looseObject({ type: z.literal("filesystem"), ...globFields }),
280
+ ]);
281
+
282
+ /** The `content` slice of a config as written, before validation. */
283
+ const rawContentSchema = z.looseObject({
284
+ content: z
285
+ .looseObject({ ...globFields, sources: z.array(z.unknown()).optional() })
286
+ .optional(),
287
+ });
288
+
289
+ /**
290
+ * The content roots to scan, read from the config as written rather than the
291
+ * validated config: the upgrade runs on configs that don't validate yet. Its
292
+ * filesystem sources when it lists any, else the `content.root` shorthand,
293
+ * else the zero-config `docs` folder.
294
+ */
295
+ export const contentGlobs = ({
296
+ content,
297
+ }: z.infer<typeof rawContentSchema>): ContentGlobs[] => {
298
+ const sources = (content?.sources ?? []).flatMap((source) => {
299
+ const filesystem = rawFilesystemSourceSchema.safeParse(source);
300
+ return filesystem.success ? [filesystem.data] : [];
301
+ });
302
+ return (sources.length > 0 ? sources : [content ?? {}]).map((globs) => ({
303
+ exclude: globs.exclude ?? DEFAULT_CONTENT_EXCLUDE,
304
+ include: globs.include ?? DEFAULT_CONTENT_INCLUDE,
305
+ root: globs.root ?? "docs",
306
+ }));
307
+ };
308
+
309
+ /** The content roots the project's config names, loaded as written. */
310
+ const configContentGlobs = async (root: string): Promise<ContentGlobs[]> => {
311
+ const file = findConfigFile(root);
312
+ let raw: z.infer<typeof rawContentSchema> = {};
313
+ if (file) {
314
+ try {
315
+ const parsed = rawContentSchema.safeParse(
316
+ await createModuleLoader()(file)
317
+ );
318
+ raw = parsed.success ? parsed.data : {};
319
+ } catch {
320
+ // A config that won't load is already reported by the config check;
321
+ // its content still gets the zero-config scan.
322
+ }
323
+ }
324
+ return contentGlobs(raw);
325
+ };
326
+
327
+ const isPathKey = (segment: PropertyKey): segment is number | string =>
328
+ typeof segment !== "symbol";
329
+
330
+ // Zod's own wording for an unknown key; a removed field's hint replaces it.
331
+ const PLAIN_UNKNOWN_KEY = "Unrecognized key";
332
+
333
+ /**
334
+ * The removed fields among one page's front matter issues, each at its own
335
+ * line. Only issues the page schema words as a removed-field hint count: a
336
+ * key a project declares through `frontmatter.extend` is unknown to the bare
337
+ * schema, and any other invalid value was already an error on Blume 1.
338
+ */
339
+ const removedFieldFindings = (
340
+ file: string,
341
+ text: string,
342
+ issues: readonly z.core.$ZodIssue[]
343
+ ): Diagnostic[] =>
344
+ issues.flatMap((issue) => {
345
+ if (
346
+ issue.code !== "unrecognized_keys" ||
347
+ issue.message.startsWith(PLAIN_UNKNOWN_KEY)
348
+ ) {
349
+ return [];
350
+ }
351
+ const path = issue.path.filter(isPathKey);
352
+ const position =
353
+ locateFrontmatterKey(text, [...path, ...issue.keys.slice(0, 1)]) ??
354
+ locateFrontmatterKey(text, path);
355
+ return [
356
+ {
357
+ code: "BLUME_FRONTMATTER_INVALID",
358
+ column: position?.column,
359
+ file,
360
+ line: position?.line,
361
+ message: issue.message,
362
+ severity: "error",
363
+ } satisfies Diagnostic,
364
+ ];
365
+ });
366
+
367
+ /** The removed front matter fields in one page, or none it can't parse. */
368
+ const pageFindings = async (file: string): Promise<Diagnostic[]> => {
369
+ const text = await readFile(file, "utf-8");
370
+ let parsed: ReturnType<typeof pageMetaSchema.safeParse>;
371
+ try {
372
+ parsed = pageMetaSchema.safeParse(matter(text).data);
373
+ } catch {
374
+ // Unparseable front matter fails the build with its own diagnostic.
375
+ return [];
376
+ }
377
+ return parsed.success
378
+ ? []
379
+ : removedFieldFindings(file, text, parsed.error.issues);
380
+ };
381
+
382
+ /**
383
+ * A finding for each front matter field Blume 2 removed, across the project's
384
+ * local content. A page with one fails validation and drops out of the build,
385
+ * which the config and components checks alone would report as ready.
386
+ */
387
+ const frontmatterFindings = async (root: string): Promise<Diagnostic[]> => {
388
+ const roots = await configContentGlobs(root);
389
+ const matches = await Promise.all(
390
+ roots.map((globs) => {
391
+ const cwd = resolve(root, globs.root);
392
+ return existsSync(cwd)
393
+ ? glob(globs.include, {
394
+ absolute: true,
395
+ cwd,
396
+ ignore: [...globs.exclude, ...baselineScanIgnore()],
397
+ onlyFiles: true,
398
+ })
399
+ : [];
400
+ })
401
+ );
402
+ // Two sources can share a folder; each page is checked once.
403
+ const files = [...new Set(matches.flat())].toSorted();
404
+ const findings = await Promise.all(files.map(pageFindings));
405
+ return findings.flat();
406
+ };
407
+
408
+ /**
409
+ * Run one check, turning the {@link BlumeError} it throws into its findings:
410
+ * each config issue or `components.ts` entry on its own, or the one diagnostic
411
+ * any other check has.
412
+ */
413
+ const findingsOf = async (
414
+ check: () => Promise<void>
415
+ ): Promise<Diagnostic[]> => {
416
+ try {
417
+ await check();
418
+ return [];
419
+ } catch (error) {
420
+ if (
421
+ error instanceof ConfigValidationError ||
422
+ error instanceof ComponentOverridesError
423
+ ) {
424
+ return error.issues;
425
+ }
426
+ if (error instanceof BlumeError) {
427
+ return [error.diagnostic];
428
+ }
429
+ throw error;
430
+ }
431
+ };
432
+
433
+ /**
434
+ * Check a project against this version of Blume: its config through the
435
+ * loader (every invalid field, each with its line and replacement), its
436
+ * `components.ts` through the static override planner (each entry at its
437
+ * line), its pages' front matter for removed fields, and its package.json
438
+ * scripts for `blume build` flags that no longer exist. Returns the failures;
439
+ * an empty list means the project is ready.
440
+ */
441
+ export const collectUpgradeFindings = async (
442
+ root: string
443
+ ): Promise<Diagnostic[]> => {
444
+ const componentsFile = findComponentsFile(root);
445
+ return [
446
+ ...(await findingsOf(async () => {
447
+ await loadConfig(root);
448
+ })),
449
+ ...(componentsFile
450
+ ? await findingsOf(async () => {
451
+ analyzeComponentOverrides(
452
+ await readFile(componentsFile, "utf-8"),
453
+ componentsFile
454
+ );
455
+ })
456
+ : []),
457
+ ...(await frontmatterFindings(root)),
458
+ ...(await scriptFindings(root)),
459
+ ];
460
+ };
461
+
462
+ /** A finding as plain text for the agent: where, what, and the fix. */
463
+ const plainFinding = (finding: Diagnostic, root: string): string => {
464
+ const where = finding.file
465
+ ? `${relative(root, finding.file)}${finding.line === undefined ? "" : `:${finding.line}`}`
466
+ : "blume.config.ts";
467
+ const fix = finding.suggestion ? `\n Fix: ${finding.suggestion}` : "";
468
+ return `- ${where} (${finding.code})\n ${finding.message.replaceAll("\n", "\n ")}${fix}`;
469
+ };
470
+
471
+ /**
472
+ * The handoff prompt: the findings inline (they're few, and each already
473
+ * names its replacement), where the guide is, and the ground rules — change
474
+ * the config's shape, never the site's behavior, and verify with the site's
475
+ * own checks, run through the project's package runner (`npx`, `pnpm exec`),
476
+ * since a local install puts no `blume` on PATH.
477
+ */
478
+ export const upgradePrompt = (options: {
479
+ findings: Diagnostic[];
480
+ guidePath: string;
481
+ root: string;
482
+ runner: string;
483
+ version: string;
484
+ }): string =>
485
+ `Upgrade this Blume project to Blume ${options.version}. \`blume upgrade\` has bumped the \`blume\` dependency in package.json where it could; what's left is the config.
486
+
487
+ The upgrade guide is at ${options.guidePath} (online at ${UPGRADE_GUIDE_URL}). It covers every change between Blume 1 and 2 with before-and-after examples: search, deployment, content sources, API references, analytics, and Ask AI become adapters imported from \`blume/*\` subpaths; the machine-readable settings move from \`ai\` to \`agents\`; and \`components.ts\` entries must be one of the static forms.
488
+
489
+ \`blume upgrade\` found:
490
+
491
+ ${options.findings.map((finding) => plainFinding(finding, options.root)).join("\n\n")}
492
+
493
+ Work through every finding:
494
+ 1. Read the guide section for each change before editing.
495
+ 2. Rewrite the config to the Blume 2 form, adding the adapter imports it needs. Keep the site's behavior the same: the same content, routes, search backend, deployment target, analytics, and credentials (keep reading secrets from the same environment variables).
496
+ 3. The config loader reports every invalid field at once, but some changes only surface once earlier ones are fixed, so rerun \`${options.runner} blume doctor\` after each round of edits.
497
+ 4. Never delete content, or remove a setting only to silence an error; if something needs a human decision, leave it and say so in your summary.
498
+
499
+ When \`${options.runner} blume doctor\` reports no errors, run \`${options.runner} blume build\` and fix anything it reports until it succeeds.`;
@@ -1,164 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- siteRoot,
4
- absoluteUrl,
5
- MCP_TOOLS
6
- } from "./chunk-ct47dqpx.js";
7
- import {
8
- resolveReferences
9
- } from "./chunk-7s8hm3b6.js";
10
- import {
11
- trimChar,
12
- normalizeBasePath,
13
- withBasePath
14
- } from "./chunk-2mzebbbz.js";
15
-
16
- // src/ai/api/paths.ts
17
- var OPENAPI_PATH = "/openapi.json";
18
- var API_BASE = "/api/docs";
19
- var API_PAGES_PATH = `${API_BASE}/pages.json`;
20
- var API_PAGE_PATH = `${API_BASE}/pages/{route}.json`;
21
- var API_NAVIGATION_PATH = `${API_BASE}/navigation.json`;
22
- var API_SEARCH_PATH = `${API_BASE}/search`;
23
- var pageParam = (route) => route === "/" ? "index" : route.slice(1);
24
- var pageJsonPath = (route) => `${API_BASE}/pages/${pageParam(route)}.json`;
25
-
26
- // src/ai/api-catalog.ts
27
- var API_CATALOG_PATH = "/.well-known/api-catalog";
28
- var API_CATALOG_TYPE = "application/linkset+json";
29
- var HTTP_URL = /^https?:\/\//u;
30
- var linksetEntries = (config) => {
31
- const site = config.deployment.site ?? null;
32
- const deployBase = normalizeBasePath(config.deployment.base);
33
- const abs = (path) => {
34
- const based = withBasePath(deployBase, path);
35
- return site ? absoluteUrl(site, based) : based;
36
- };
37
- const entries = [];
38
- for (const reference of resolveReferences(config)) {
39
- const docRoute = reference.renderer === "blume" ? withBasePath(reference.basePath, reference.route) : reference.route;
40
- const entry = {
41
- anchor: abs(docRoute),
42
- "service-doc": [{ href: abs(docRoute), type: "text/html" }]
43
- };
44
- if (HTTP_URL.test(reference.spec)) {
45
- entry["service-desc"] = [{ href: reference.spec }];
46
- }
47
- entries.push(entry);
48
- }
49
- if (config.ai.api) {
50
- entries.push({
51
- anchor: abs(API_BASE),
52
- "service-desc": [{ href: abs(OPENAPI_PATH), type: "application/json" }],
53
- "service-doc": [{ href: abs("/"), type: "text/html" }]
54
- });
55
- }
56
- if (config.ai.mcp.enabled) {
57
- entries.push({
58
- anchor: abs(config.ai.mcp.route),
59
- "service-desc": [
60
- { href: abs("/.well-known/mcp.json"), type: "application/json" }
61
- ],
62
- "service-doc": [{ href: abs("/"), type: "text/html" }]
63
- });
64
- }
65
- return entries;
66
- };
67
- var hasApiCatalog = (config) => linksetEntries(config).length > 0;
68
-
69
- // src/ai/mcp/discovery.ts
70
- var serverUrl = (input) => {
71
- const path = withBasePath(input.base, input.route);
72
- return input.site ? absoluteUrl(input.site, path) : path;
73
- };
74
- var buildMcpDiscovery = (input) => ({
75
- servers: [
76
- {
77
- name: input.name,
78
- transport: "streamable-http",
79
- url: serverUrl(input)
80
- }
81
- ]
82
- });
83
- var SERVER_CARD_SCHEMA = "https://static.modelcontextprotocol.io/schemas/v1/server-card.schema.json";
84
- var CARD_TEXT_MAX = 100;
85
- var truncate = (text) => text.length > CARD_TEXT_MAX ? `${text.slice(0, CARD_TEXT_MAX - 1)}…` : text;
86
- var NON_ASCII_SLUG = /[^a-z0-9]+/gu;
87
- var COMBINING_MARKS = /\p{M}+/gu;
88
- var asciiSlugify = (text) => trimChar(text.normalize("NFKD").replace(COMBINING_MARKS, "").toLowerCase().replace(NON_ASCII_SLUG, "-"), "-");
89
- var reverseDnsName = (input) => {
90
- let namespace = "localhost";
91
- if (input.site) {
92
- try {
93
- namespace = new URL(input.site).hostname.split(".").toReversed().join(".");
94
- } catch {}
95
- }
96
- return `${namespace}/${asciiSlugify(input.name) || "docs"}`;
97
- };
98
- var HTTP_URL2 = /^https?:\/\//u;
99
- var buildMcpServerCard = (input) => {
100
- const url = serverUrl(input);
101
- const card = {
102
- $schema: SERVER_CARD_SCHEMA,
103
- capabilities: {
104
- resources: { listChanged: false, subscribe: false },
105
- tools: { listChanged: false }
106
- },
107
- description: truncate(`Model Context Protocol server for the ${input.name} documentation.`),
108
- name: reverseDnsName(input),
109
- serverInfo: { name: input.name, version: input.version },
110
- title: truncate(input.name),
111
- tools: MCP_TOOLS.map((tool) => ({
112
- annotations: tool.annotations,
113
- description: tool.description,
114
- name: tool.name,
115
- title: tool.title
116
- })),
117
- transport: "streamable-http",
118
- transports: [{ endpoint: url, type: "streamable-http" }],
119
- url,
120
- version: input.version
121
- };
122
- if (HTTP_URL2.test(url)) {
123
- card.remotes = [{ type: "streamable-http", url }];
124
- }
125
- if (input.site) {
126
- card.websiteUrl = siteRoot(input.site);
127
- }
128
- return card;
129
- };
130
-
131
- // src/ai/skills.ts
132
- import { join } from "pathe";
133
-
134
- // src/ai/tar.ts
135
- import { createTar } from "nanotar";
136
- var encoder = new TextEncoder;
137
-
138
- // src/ai/skills.ts
139
- var AGENT_SKILLS_DIR = "/.well-known/agent-skills";
140
- var AGENT_SKILLS_INDEX_PATH = "/.well-known/agent-skills/index.json";
141
-
142
- // src/ai/ai-catalog.ts
143
- var AI_CATALOG_PATH = "/.well-known/ai-catalog.json";
144
- var ARD_MANIFEST_PATH = "/.well-known/ard.json";
145
- var AI_CATALOG_TYPE = "application/ai-catalog+json";
146
- var hasAiCatalog = (config) => config.ai.catalog.enabled && Boolean(config.deployment.site) && (config.ai.mcp.enabled || config.ai.api || config.ai.llmsTxt.enabled || Boolean(config.ai.skills) || resolveReferences(config).length > 0);
147
- var crossOriginDiscoveryPaths = (config) => {
148
- const paths = [];
149
- if (hasAiCatalog(config)) {
150
- paths.push(AI_CATALOG_PATH, ARD_MANIFEST_PATH);
151
- }
152
- if (hasApiCatalog(config)) {
153
- paths.push(API_CATALOG_PATH);
154
- }
155
- if (config.ai.mcp.enabled) {
156
- paths.push("/.well-known/mcp.json", "/.well-known/mcp/server-card.json");
157
- }
158
- return paths;
159
- };
160
-
161
- export { OPENAPI_PATH, API_PAGES_PATH, API_PAGE_PATH, API_NAVIGATION_PATH, API_SEARCH_PATH, pageJsonPath, API_CATALOG_PATH, API_CATALOG_TYPE, hasApiCatalog, buildMcpDiscovery, buildMcpServerCard, AGENT_SKILLS_DIR, AGENT_SKILLS_INDEX_PATH, AI_CATALOG_PATH, AI_CATALOG_TYPE, hasAiCatalog, crossOriginDiscoveryPaths };
162
-
163
- //# debugId=26AE621DEDAFCC8A64756E2164756E21
164
- //# sourceMappingURL=chunk-0qymqwzz.js.map