blume 1.7.3 → 2.0.1

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 (690) hide show
  1. package/AGENTS.md +19 -0
  2. package/CHANGELOG.md +245 -0
  3. package/README.md +34 -21
  4. package/dist/cli/{chunk-vacwm2hv.js → chunk-27g6wdth.js} +2 -2
  5. package/dist/cli/{chunk-ps4m1xh4.js → chunk-2hn4b8z7.js} +513 -550
  6. package/dist/cli/chunk-2hn4b8z7.js.map +12 -0
  7. package/dist/cli/chunk-5shv93fd.js +39 -0
  8. package/dist/cli/chunk-5shv93fd.js.map +10 -0
  9. package/dist/cli/chunk-6crbhc3x.js +361 -0
  10. package/dist/cli/chunk-6crbhc3x.js.map +14 -0
  11. package/dist/cli/{chunk-8cjtbafj.js → chunk-6hsn950k.js} +109 -383
  12. package/dist/cli/chunk-6hsn950k.js.map +10 -0
  13. package/dist/cli/chunk-6vm74dry.js +148 -0
  14. package/dist/cli/chunk-6vm74dry.js.map +10 -0
  15. package/dist/cli/{chunk-yg63d42r.js → chunk-79jhk4py.js} +87 -58
  16. package/dist/cli/chunk-79jhk4py.js.map +35 -0
  17. package/dist/cli/chunk-82bbrxdn.js +51 -0
  18. package/dist/cli/chunk-82bbrxdn.js.map +10 -0
  19. package/dist/cli/chunk-abh8yjkn.js +31 -0
  20. package/dist/cli/chunk-abh8yjkn.js.map +10 -0
  21. package/dist/cli/chunk-ah61y8py.js +75 -0
  22. package/dist/cli/chunk-ah61y8py.js.map +11 -0
  23. package/dist/cli/{chunk-dwgcp5sm.js → chunk-ce574jw2.js} +1 -1
  24. package/dist/cli/chunk-ch6g3ar0.js +102 -0
  25. package/dist/cli/chunk-ch6g3ar0.js.map +10 -0
  26. package/dist/cli/chunk-dh8cwk36.js +279 -0
  27. package/dist/cli/chunk-dh8cwk36.js.map +10 -0
  28. package/dist/cli/{chunk-rqy0s5wh.js → chunk-epjnccmv.js} +17 -16
  29. package/dist/cli/{chunk-rqy0s5wh.js.map → chunk-epjnccmv.js.map} +3 -3
  30. package/dist/cli/chunk-f2z5v128.js +97 -0
  31. package/dist/cli/chunk-f2z5v128.js.map +10 -0
  32. package/dist/cli/{chunk-2z47ypj8.js → chunk-fa25z98p.js} +16 -3
  33. package/dist/cli/chunk-fa25z98p.js.map +11 -0
  34. package/dist/cli/{chunk-1jefwnfs.js → chunk-fs23ddbb.js} +1076 -2592
  35. package/dist/cli/chunk-fs23ddbb.js.map +35 -0
  36. package/dist/cli/{chunk-e7f42gdj.js → chunk-fxypxtvm.js} +2 -2
  37. package/dist/cli/{chunk-bvwwhd84.js → chunk-fz5wtpmh.js} +15 -15
  38. package/dist/cli/{chunk-bvwwhd84.js.map → chunk-fz5wtpmh.js.map} +1 -1
  39. package/dist/cli/chunk-hdpx1tax.js +91 -0
  40. package/dist/cli/chunk-hdpx1tax.js.map +10 -0
  41. package/dist/cli/{chunk-ct47dqpx.js → chunk-jts8mvcz.js} +67 -7
  42. package/dist/cli/{chunk-2mzebbbz.js.map → chunk-jts8mvcz.js.map} +6 -4
  43. package/dist/cli/{chunk-ahnw3kxw.js → chunk-jwyddg7y.js} +27 -22
  44. package/dist/cli/chunk-jwyddg7y.js.map +15 -0
  45. package/dist/cli/{chunk-cjtn640a.js → chunk-kdp5q7ke.js} +43 -20
  46. package/dist/cli/chunk-kdp5q7ke.js.map +10 -0
  47. package/dist/cli/{chunk-5g0w1e2c.js → chunk-kpf8rrjc.js} +28 -16
  48. package/dist/cli/{chunk-5g0w1e2c.js.map → chunk-kpf8rrjc.js.map} +4 -4
  49. package/dist/cli/chunk-m3vmjgmq.js +133 -0
  50. package/dist/cli/chunk-m3vmjgmq.js.map +10 -0
  51. package/dist/cli/{chunk-b27xqwn9.js → chunk-mb2919y2.js} +9 -5
  52. package/dist/cli/chunk-mb2919y2.js.map +10 -0
  53. package/dist/cli/{chunk-5qk08vmp.js → chunk-q5163e60.js} +133 -54
  54. package/dist/cli/chunk-q5163e60.js.map +11 -0
  55. package/dist/cli/chunk-qkqwkpte.js +12437 -0
  56. package/dist/cli/chunk-qkqwkpte.js.map +182 -0
  57. package/dist/cli/{chunk-4x36ddpw.js → chunk-qs4q5p4e.js} +81 -87
  58. package/dist/cli/chunk-qs4q5p4e.js.map +10 -0
  59. package/dist/cli/{chunk-0xjyb285.js → chunk-qwsrynx5.js} +15 -5
  60. package/dist/cli/{chunk-0xjyb285.js.map → chunk-qwsrynx5.js.map} +4 -4
  61. package/dist/cli/chunk-s1p84fyh.js +261 -0
  62. package/dist/cli/chunk-s1p84fyh.js.map +10 -0
  63. package/dist/cli/chunk-s6jhgk0q.js +176 -0
  64. package/dist/cli/chunk-s6jhgk0q.js.map +11 -0
  65. package/dist/cli/chunk-vtk4a6dg.js +374 -0
  66. package/dist/cli/chunk-vtk4a6dg.js.map +10 -0
  67. package/dist/cli/{chunk-k79xp7av.js → chunk-wgm7m9qk.js} +230 -700
  68. package/dist/cli/chunk-wgm7m9qk.js.map +36 -0
  69. package/dist/cli/chunk-wm7js3j9.js +145 -0
  70. package/dist/cli/chunk-wm7js3j9.js.map +11 -0
  71. package/dist/cli/chunk-yt5n7ppj.js +79 -0
  72. package/dist/cli/chunk-yt5n7ppj.js.map +10 -0
  73. package/dist/cli/{chunk-3r45185y.js → chunk-yw7dm696.js} +9 -11
  74. package/dist/cli/{chunk-3r45185y.js.map → chunk-yw7dm696.js.map} +3 -3
  75. package/dist/cli/{chunk-nn13znc2.js → chunk-zxcczpyx.js} +1 -1
  76. package/dist/cli/chunk-zxh4d9vy.js +122 -0
  77. package/dist/cli/chunk-zxh4d9vy.js.map +11 -0
  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-context.d.ts +7 -7
  85. package/dist/types/ai/ask.d.ts +368 -0
  86. package/dist/types/ai/changelog-markdown.d.ts +2 -0
  87. package/dist/types/ai/component-markdown.d.ts +2 -2
  88. package/dist/types/ai/index.d.ts +24 -0
  89. package/dist/types/ai/link-headers.d.ts +24 -0
  90. package/dist/types/ai/llms.d.ts +25 -0
  91. package/dist/types/ai/markdown.d.ts +45 -0
  92. package/dist/types/ai/mcp/discovery.d.ts +68 -0
  93. package/dist/types/ai/mcp/tools.d.ts +16 -0
  94. package/dist/types/ai/openapi-components.d.ts +43 -0
  95. package/dist/types/ai/relative-links.d.ts +26 -0
  96. package/dist/types/ai/serializers.d.ts +15 -0
  97. package/dist/types/ai/skills.d.ts +42 -0
  98. package/dist/types/ai/tar.d.ts +25 -0
  99. package/dist/types/ai/visibility.d.ts +17 -0
  100. package/dist/types/ai/web-bot-auth.d.ts +16 -0
  101. package/dist/types/analytics/adobe.d.ts +35 -0
  102. package/dist/types/analytics/amplitude.d.ts +50 -0
  103. package/dist/types/analytics/clarity.d.ts +31 -0
  104. package/dist/types/analytics/clearbit.d.ts +29 -0
  105. package/dist/types/analytics/cloudflare.d.ts +41 -0
  106. package/dist/types/analytics/fathom.d.ts +41 -0
  107. package/dist/types/analytics/google-analytics.d.ts +44 -0
  108. package/dist/types/analytics/google-tag-manager.d.ts +40 -0
  109. package/dist/types/analytics/head.d.ts +30 -0
  110. package/dist/types/analytics/heap.d.ts +40 -0
  111. package/dist/types/analytics/hightouch.d.ts +44 -0
  112. package/dist/types/analytics/hotjar.d.ts +33 -0
  113. package/dist/types/analytics/index.d.ts +61 -0
  114. package/dist/types/analytics/inline.d.ts +17 -0
  115. package/dist/types/analytics/logrocket.d.ts +44 -0
  116. package/dist/types/analytics/mixpanel.d.ts +67 -0
  117. package/dist/types/analytics/pirsch.d.ts +42 -0
  118. package/dist/types/analytics/plausible.d.ts +56 -0
  119. package/dist/types/analytics/posthog.d.ts +45 -0
  120. package/dist/types/analytics/schema.d.ts +320 -0
  121. package/dist/types/analytics/script.d.ts +46 -0
  122. package/dist/types/analytics/segment.d.ts +50 -0
  123. package/dist/types/analytics/vercel.d.ts +48 -0
  124. package/dist/types/astro/integration.d.ts +76 -0
  125. package/dist/types/astro/markdown-negotiation.d.ts +23 -0
  126. package/dist/types/astro/module-types.d.ts +14 -0
  127. package/dist/types/astro/pages.d.ts +44 -0
  128. package/dist/types/cli/env.d.ts +12 -0
  129. package/dist/types/cli/init/scaffold.d.ts +154 -0
  130. package/dist/types/components/layout/nav-utils.d.ts +11 -0
  131. package/dist/types/core/adapter.d.ts +47 -0
  132. package/dist/types/core/api-name.d.ts +7 -0
  133. package/dist/types/core/changelog-index.d.ts +13 -0
  134. package/dist/types/core/config-input.d.ts +197 -526
  135. package/dist/types/core/config.d.ts +61 -35
  136. package/dist/types/core/content-assets.d.ts +76 -0
  137. package/dist/types/core/custom-pages.d.ts +33 -0
  138. package/dist/types/core/data.d.ts +30 -15
  139. package/dist/types/core/define-components.d.ts +12 -9
  140. package/dist/types/core/deployment-env.d.ts +6 -11
  141. package/dist/types/core/frontmatter.d.ts +10 -0
  142. package/dist/types/core/graph.d.ts +18 -0
  143. package/dist/types/core/heading-markers.d.ts +54 -0
  144. package/dist/types/core/i18n-ui.d.ts +12 -10
  145. package/dist/types/core/i18n.d.ts +87 -0
  146. package/dist/types/core/includes.d.ts +138 -0
  147. package/dist/types/core/last-modified.d.ts +47 -0
  148. package/dist/types/core/links.d.ts +95 -0
  149. package/dist/types/core/locale-links.d.ts +60 -0
  150. package/dist/types/core/manifest.d.ts +17 -0
  151. package/dist/types/core/meta.d.ts +38 -0
  152. package/dist/types/core/nav-diagnostics.d.ts +26 -0
  153. package/dist/types/core/navigation.d.ts +6 -0
  154. package/dist/types/core/node-require.d.ts +19 -0
  155. package/dist/types/core/package-json.d.ts +13 -0
  156. package/dist/types/core/probe.d.ts +42 -0
  157. package/dist/types/core/project-graph.d.ts +51 -0
  158. package/dist/types/core/project.d.ts +2 -0
  159. package/dist/types/core/safe-href.d.ts +2 -0
  160. package/dist/types/core/safe-links.d.ts +26 -0
  161. package/dist/types/core/schema.d.ts +2284 -454
  162. package/dist/types/core/site-url.d.ts +16 -0
  163. package/dist/types/core/sources/assets.d.ts +36 -0
  164. package/dist/types/core/sources/cache.d.ts +37 -0
  165. package/dist/types/core/sources/collection.d.ts +28 -0
  166. package/dist/types/core/sources/contentful-rich-text.d.ts +31 -0
  167. package/dist/types/core/sources/contentful.d.ts +40 -0
  168. package/dist/types/core/sources/filesystem.d.ts +24 -0
  169. package/dist/types/core/sources/github-releases.d.ts +31 -0
  170. package/dist/types/core/sources/json.d.ts +30 -0
  171. package/dist/types/core/sources/lexical.d.ts +19 -0
  172. package/dist/types/core/sources/lower.d.ts +75 -0
  173. package/dist/types/core/sources/mdx-remote.d.ts +28 -0
  174. package/dist/types/core/sources/normalize.d.ts +147 -0
  175. package/dist/types/core/sources/notion.d.ts +131 -0
  176. package/dist/types/core/sources/obsidian.d.ts +46 -0
  177. package/dist/types/core/sources/payload.d.ts +39 -0
  178. package/dist/types/core/sources/portable-text.d.ts +42 -0
  179. package/dist/types/core/sources/read.d.ts +23 -0
  180. package/dist/types/core/sources/remote.d.ts +74 -0
  181. package/dist/types/core/sources/resolve.d.ts +19 -0
  182. package/dist/types/core/sources/sanity.d.ts +43 -0
  183. package/dist/types/core/sources/strapi-blocks.d.ts +12 -0
  184. package/dist/types/core/sources/strapi.d.ts +33 -0
  185. package/dist/types/core/sources/types.d.ts +7 -0
  186. package/dist/types/core/sources/watch.d.ts +45 -0
  187. package/dist/types/core/text-width.d.ts +11 -0
  188. package/dist/types/core/types.d.ts +15 -1
  189. package/dist/types/core/unrecognized-keys.d.ts +7 -0
  190. package/dist/types/core/versions.d.ts +72 -0
  191. package/dist/types/core/yaml.d.ts +9 -0
  192. package/dist/types/deploy/adapter-output.d.ts +45 -0
  193. package/dist/types/deploy/adapters/cloudflare.d.ts +40 -0
  194. package/dist/types/deploy/adapters/index.d.ts +29 -0
  195. package/dist/types/deploy/adapters/netlify.d.ts +37 -0
  196. package/dist/types/deploy/adapters/node.d.ts +37 -0
  197. package/dist/types/deploy/adapters/registry.d.ts +133 -0
  198. package/dist/types/deploy/adapters/types.d.ts +71 -0
  199. package/dist/types/deploy/adapters/vercel.d.ts +38 -0
  200. package/dist/types/deploy/artifacts.d.ts +65 -0
  201. package/dist/types/deploy/cloudflare-negotiation.d.ts +196 -0
  202. package/dist/types/deploy/function-bundle.d.ts +80 -0
  203. package/dist/types/deploy/headers.d.ts +50 -0
  204. package/dist/types/deploy/node-headers.d.ts +42 -0
  205. package/dist/types/deploy/platforms/cloudflare.d.ts +40 -0
  206. package/dist/types/deploy/platforms/index.d.ts +18 -0
  207. package/dist/types/deploy/platforms/netlify.d.ts +13 -0
  208. package/dist/types/deploy/platforms/node.d.ts +11 -0
  209. package/dist/types/deploy/platforms/paths.d.ts +27 -0
  210. package/dist/types/deploy/platforms/static.d.ts +10 -0
  211. package/dist/types/deploy/platforms/types.d.ts +104 -0
  212. package/dist/types/deploy/platforms/vercel.d.ts +32 -0
  213. package/dist/types/deploy/redirects.d.ts +53 -0
  214. package/dist/types/deploy/robots.d.ts +8 -0
  215. package/dist/types/deploy/rss.d.ts +31 -0
  216. package/dist/types/deploy/sitemap.d.ts +21 -0
  217. package/dist/types/deploy/vercel-negotiation.d.ts +109 -0
  218. package/dist/types/markdown/code-title.d.ts +32 -0
  219. package/dist/types/markdown/fence-meta.d.ts +23 -0
  220. package/dist/types/markdown/themes.d.ts +3 -3
  221. package/dist/types/openapi/asyncapi.d.ts +129 -0
  222. package/dist/types/openapi/graphql-build.d.ts +8 -0
  223. package/dist/types/openapi/graphql.d.ts +122 -0
  224. package/dist/types/openapi/model.d.ts +158 -0
  225. package/dist/types/openapi/parse.d.ts +57 -0
  226. package/dist/types/openapi/references.d.ts +37 -25
  227. package/dist/types/openapi/render-mdx.d.ts +33 -0
  228. package/dist/types/openapi/sentence.d.ts +7 -0
  229. package/dist/types/openapi/signature.d.ts +10 -0
  230. package/dist/types/openapi/source.d.ts +22 -0
  231. package/dist/types/openapi/spec-dependency-error.d.ts +10 -0
  232. package/dist/types/reference/asyncapi.d.ts +166 -0
  233. package/dist/types/reference/graphql.d.ts +181 -0
  234. package/dist/types/reference/index.d.ts +32 -0
  235. package/dist/types/reference/openapi.d.ts +165 -0
  236. package/dist/types/reference/options.d.ts +157 -0
  237. package/dist/types/reference/scalar.d.ts +136 -0
  238. package/dist/types/reference/schema.d.ts +630 -0
  239. package/dist/types/search/adapters/algolia.d.ts +32 -0
  240. package/dist/types/search/adapters/flexsearch.d.ts +12 -0
  241. package/dist/types/search/adapters/index.d.ts +31 -0
  242. package/dist/types/search/adapters/mixedbread.d.ts +22 -0
  243. package/dist/types/search/adapters/orama-cloud.d.ts +33 -0
  244. package/dist/types/search/adapters/orama.d.ts +13 -0
  245. package/dist/types/search/adapters/pagefind.d.ts +12 -0
  246. package/dist/types/search/adapters/registry.d.ts +228 -0
  247. package/dist/types/search/adapters/types.d.ts +34 -0
  248. package/dist/types/search/adapters/typesense.d.ts +42 -0
  249. package/dist/types/search/build.d.ts +23 -0
  250. package/dist/types/search/documents.d.ts +90 -0
  251. package/dist/types/search/facets.d.ts +3 -0
  252. package/dist/types/search/orama-index.d.ts +1 -1
  253. package/dist/types/search/sync/algolia.d.ts +14 -0
  254. package/dist/types/search/sync/index.d.ts +14 -0
  255. package/dist/types/search/sync/orama-cloud.d.ts +10 -0
  256. package/dist/types/search/sync/typesense.d.ts +14 -0
  257. package/dist/types/sources/contentful.d.ts +68 -0
  258. package/dist/types/sources/custom.d.ts +20 -0
  259. package/dist/types/sources/filesystem.d.ts +42 -0
  260. package/dist/types/sources/github-releases.d.ts +46 -0
  261. package/dist/types/sources/index.d.ts +48 -0
  262. package/dist/types/sources/mdx-remote.d.ts +63 -0
  263. package/dist/types/sources/notion.d.ts +65 -0
  264. package/dist/types/sources/obsidian.d.ts +34 -0
  265. package/dist/types/sources/payload.d.ts +68 -0
  266. package/dist/types/sources/registry.d.ts +1414 -0
  267. package/dist/types/sources/sanity.d.ts +69 -0
  268. package/dist/types/sources/shared.d.ts +46 -0
  269. package/dist/types/sources/strapi.d.ts +66 -0
  270. package/dist/types/theme/icon-kind.d.ts +11 -0
  271. package/dist/types/theme/icons.d.ts +20 -0
  272. package/docs/01-quickstart.mdx +18 -18
  273. package/docs/02-deployment.mdx +52 -28
  274. package/docs/03-upgrading.mdx +364 -0
  275. package/docs/04-migrating.mdx +58 -0
  276. package/docs/08-faq.mdx +5 -5
  277. package/docs/advanced/blog.mdx +13 -6
  278. package/docs/advanced/changelog.mdx +23 -35
  279. package/docs/advanced/custom-pages.mdx +22 -10
  280. package/docs/advanced/meta.ts +1 -8
  281. package/docs/advanced/skills.mdx +8 -0
  282. package/docs/cli/audit.mdx +646 -0
  283. package/docs/cli/doctor.mdx +29 -0
  284. package/docs/{reference/eval.mdx → cli/evals.mdx} +12 -11
  285. package/docs/cli/index.mdx +105 -0
  286. package/docs/cli/meta.ts +7 -0
  287. package/docs/{reference → cli}/translate.mdx +9 -9
  288. package/docs/cli/validate.mdx +41 -0
  289. package/docs/cli/version.mdx +40 -0
  290. package/docs/configuration/analytics.mdx +350 -59
  291. package/docs/configuration/assistant.mdx +357 -0
  292. package/docs/configuration/customization.mdx +16 -10
  293. package/docs/configuration/index.mdx +50 -31
  294. package/docs/configuration/meta.ts +1 -1
  295. package/docs/configuration/search.mdx +76 -55
  296. package/docs/configuration/theming.mdx +24 -15
  297. package/docs/content/components.mdx +21 -5
  298. package/docs/{reference → content}/frontmatter.mdx +35 -1
  299. package/docs/content/i18n.mdx +9 -7
  300. package/docs/content/includes.mdx +2 -4
  301. package/docs/content/index.mdx +1 -1
  302. package/docs/content/islands.mdx +11 -6
  303. package/docs/content/meta.mdx +1 -1
  304. package/docs/content/meta.ts +1 -0
  305. package/docs/content/navigation.mdx +9 -7
  306. package/docs/content/sources.mdx +145 -50
  307. package/docs/content/syntax.mdx +16 -12
  308. package/docs/content/versioning.mdx +3 -3
  309. package/docs/discoverability/agent-discovery.mdx +12 -12
  310. package/docs/discoverability/index.mdx +4 -4
  311. package/docs/discoverability/json-api.mdx +4 -4
  312. package/docs/discoverability/llms-txt.mdx +6 -6
  313. package/docs/discoverability/markdown.mdx +4 -4
  314. package/docs/discoverability/mcp.mdx +11 -11
  315. package/docs/discoverability/sitemap-and-robots.mdx +3 -3
  316. package/docs/index.mdx +4 -4
  317. package/docs/references/asyncapi.mdx +59 -0
  318. package/docs/{advanced → references}/graphql.mdx +45 -32
  319. package/docs/{reference → references}/meta.ts +2 -2
  320. package/docs/references/openapi.mdx +171 -0
  321. package/docs/references/scalar.mdx +64 -0
  322. package/package.json +42 -8
  323. package/skills/blume/SKILL.md +23 -10
  324. package/skills/blume-migrate/SKILL.md +22 -21
  325. package/skills/blume-migrate/assets/oxfmt@0.67.0.patch +49 -0
  326. package/skills/blume-migrate/references/docusaurus.md +5 -4
  327. package/skills/blume-migrate/references/fumadocs.md +4 -4
  328. package/skills/blume-migrate/references/mintlify.md +23 -8
  329. package/skills/blume-migrate/references/monorepo.md +6 -6
  330. package/skills/blume-migrate/references/starlight.md +4 -4
  331. package/src/ai/agent-readability.ts +25 -26
  332. package/src/ai/ai-catalog.ts +50 -32
  333. package/src/ai/api/handlers.ts +46 -11
  334. package/src/ai/api/paths.ts +1 -1
  335. package/src/ai/api-catalog.ts +8 -8
  336. package/src/ai/ask-context.ts +7 -7
  337. package/src/ai/ask-data.ts +3 -3
  338. package/src/ai/ask.ts +637 -100
  339. package/src/ai/changelog-markdown.ts +91 -0
  340. package/src/ai/component-markdown.ts +328 -12
  341. package/src/ai/cors.ts +3 -3
  342. package/src/ai/index.ts +45 -0
  343. package/src/ai/link-headers.ts +7 -6
  344. package/src/ai/llms.ts +20 -15
  345. package/src/ai/markdown.ts +35 -5
  346. package/src/ai/mcp/data.ts +9 -5
  347. package/src/ai/openapi-components.ts +5 -2
  348. package/src/ai/relative-links.ts +170 -0
  349. package/src/ai/serializers.ts +3 -3
  350. package/src/ai/skills.ts +1 -1
  351. package/src/ai/visibility.ts +1 -1
  352. package/src/ai/web-bot-auth.ts +2 -2
  353. package/src/analytics/adobe.ts +46 -0
  354. package/src/analytics/amplitude.ts +79 -0
  355. package/src/analytics/clarity.ts +46 -0
  356. package/src/analytics/clearbit.ts +47 -0
  357. package/src/analytics/cloudflare.ts +67 -0
  358. package/src/analytics/fathom.ts +64 -0
  359. package/src/analytics/google-analytics.ts +84 -0
  360. package/src/analytics/google-tag-manager.ts +61 -0
  361. package/src/analytics/head.ts +130 -0
  362. package/src/analytics/heap.ts +65 -0
  363. package/src/analytics/hightouch.ts +77 -0
  364. package/src/analytics/hotjar.ts +47 -0
  365. package/src/analytics/index.ts +71 -0
  366. package/src/analytics/inline.ts +21 -0
  367. package/src/analytics/logrocket.ts +71 -0
  368. package/src/analytics/mixpanel.ts +92 -0
  369. package/src/analytics/pirsch.ts +66 -0
  370. package/src/analytics/plausible.ts +83 -0
  371. package/src/analytics/posthog.ts +78 -0
  372. package/src/analytics/schema.ts +60 -0
  373. package/src/analytics/script.ts +60 -0
  374. package/src/analytics/segment.ts +85 -0
  375. package/src/analytics/vercel.ts +50 -0
  376. package/src/astro/adapter-root.ts +7 -9
  377. package/src/astro/component-slots.ts +131 -91
  378. package/src/astro/generate.ts +129 -361
  379. package/src/astro/integration.ts +2 -6
  380. package/src/astro/module-types.ts +1 -1
  381. package/src/astro/pages.ts +13 -101
  382. package/src/astro/render-deps.ts +379 -0
  383. package/src/astro/runtime-deps.ts +201 -0
  384. package/src/astro/templates.ts +575 -562
  385. package/src/audit/agent.ts +24 -0
  386. package/src/audit/catalog.ts +2 -2
  387. package/src/audit/checks/assets.ts +2 -2
  388. package/src/audit/checks/dns-aid.ts +1 -1
  389. package/src/audit/checks/duplicates.ts +3 -1
  390. package/src/audit/checks/i18n.ts +1 -1
  391. package/src/audit/checks/indexability.ts +7 -7
  392. package/src/audit/checks/links.ts +2 -2
  393. package/src/audit/checks/llms.ts +6 -6
  394. package/src/audit/checks/network.ts +3 -3
  395. package/src/audit/checks/og-image.ts +2 -2
  396. package/src/audit/checks/robots.ts +1 -1
  397. package/src/audit/checks/sitemap.ts +2 -2
  398. package/src/audit/checks/social.ts +1 -1
  399. package/src/audit/run.ts +4 -3
  400. package/src/audit/terms.ts +31 -0
  401. package/src/audit/url.ts +13 -13
  402. package/src/blume-modules.d.ts +2 -2
  403. package/src/cli/command-meta.ts +10 -0
  404. package/src/cli/commands/audit.ts +40 -21
  405. package/src/cli/commands/build.ts +71 -316
  406. package/src/cli/commands/check.ts +1 -0
  407. package/src/cli/commands/dev.ts +40 -1
  408. package/src/cli/commands/doctor.ts +92 -14
  409. package/src/cli/commands/eject.ts +44 -7
  410. package/src/cli/commands/eval.ts +5 -5
  411. package/src/cli/commands/init.ts +161 -41
  412. package/src/cli/commands/migrate.ts +121 -0
  413. package/src/cli/commands/preview.ts +7 -1
  414. package/src/cli/commands/translate.ts +5 -5
  415. package/src/cli/commands/upgrade.ts +141 -0
  416. package/src/cli/commands/version.ts +57 -44
  417. package/src/cli/eject-scripts.ts +121 -6
  418. package/src/cli/index.ts +11 -1
  419. package/src/cli/init/install.ts +70 -0
  420. package/src/cli/init/questions.ts +7 -0
  421. package/src/cli/init/scaffold.ts +459 -75
  422. package/src/cli/lazy-command.ts +37 -1
  423. package/src/cli/prepare.ts +40 -6
  424. package/src/cli/required-secrets.ts +39 -12
  425. package/src/cli/unknown-flags.ts +266 -0
  426. package/src/cli/yarn-pnp.ts +52 -0
  427. package/src/components/content/AccordionItem.astro +7 -1
  428. package/src/components/content/Card.astro +4 -3
  429. package/src/components/content/ColorItem.astro +22 -4
  430. package/src/components/content/GithubInfo.astro +2 -2
  431. package/src/components/content/Prompt.astro +25 -25
  432. package/src/components/content/Tabs.astro +3 -1
  433. package/src/components/content/Tile.astro +2 -3
  434. package/src/components/content/Tooltip.astro +57 -9
  435. package/src/components/content/content-strings.ts +34 -0
  436. package/src/components/content/diff.ts +1 -1
  437. package/src/components/content/mermaid-element.ts +13 -2
  438. package/src/components/content/prompt-markdown.ts +292 -0
  439. package/src/components/content/tooltip-id.ts +41 -0
  440. package/src/components/copy-feedback.ts +1 -1
  441. package/src/components/islands/{AskAI.astro → Assistant.astro} +10 -10
  442. package/src/components/islands/{ask-ai.tsx → assistant.tsx} +23 -23
  443. package/src/components/islands/hooks.ts +36 -11
  444. package/src/components/layout/Analytics.astro +21 -79
  445. package/src/components/layout/Banner.astro +3 -1
  446. package/src/components/layout/DiscoveryLinks.astro +69 -0
  447. package/src/components/layout/Header.astro +93 -30
  448. package/src/components/layout/LanguageSwitcher.astro +4 -1
  449. package/src/components/layout/Logo.astro +23 -2
  450. package/src/components/layout/NavSelector.astro +13 -2
  451. package/src/components/layout/NavTree.astro +12 -3
  452. package/src/components/layout/NavTreeScript.astro +17 -3
  453. package/src/components/layout/PageActions.astro +3 -3
  454. package/src/components/layout/PageFeedback.astro +11 -1
  455. package/src/components/layout/PageLayout.astro +58 -11
  456. package/src/components/layout/Pagination.astro +7 -7
  457. package/src/components/layout/ReferenceLayout.astro +22 -13
  458. package/src/components/layout/RootLayout.astro +75 -72
  459. package/src/components/layout/Search.astro +43 -19
  460. package/src/components/layout/WebMcp.astro +1 -1
  461. package/src/components/layout/analytics-client.ts +73 -16
  462. package/src/components/layout/drawer-inert.ts +113 -15
  463. package/src/components/layout/dropdown-clamp.ts +105 -0
  464. package/src/components/layout/head-scripts.ts +15 -6
  465. package/src/components/layout/nav-utils.ts +17 -0
  466. package/src/components/layout/search/algolia.ts +8 -8
  467. package/src/components/layout/search/orama-cloud.ts +9 -7
  468. package/src/components/layout/search/typesense.ts +11 -17
  469. package/src/components/openapi/MessageComposer.astro +2 -2
  470. package/src/components/openapi/Playground.astro +2 -2
  471. package/src/components/openapi/description.ts +2 -2
  472. package/src/components/openapi/playground-client.ts +79 -10
  473. package/src/core/changelog-index.ts +24 -0
  474. package/src/core/code-fences.ts +1 -1
  475. package/src/core/component-overrides.ts +399 -154
  476. package/src/core/config-input.ts +201 -566
  477. package/src/core/config.ts +131 -42
  478. package/src/core/custom-pages.ts +105 -0
  479. package/src/core/data.ts +34 -15
  480. package/src/core/define-components.ts +12 -9
  481. package/src/core/deployment-env.ts +18 -74
  482. package/src/core/diagnostics.ts +14 -7
  483. package/src/core/graph.ts +69 -25
  484. package/src/core/i18n-ui.ts +41 -11
  485. package/src/core/i18n.ts +17 -0
  486. package/src/core/includes.ts +156 -38
  487. package/src/core/last-modified.ts +6 -11
  488. package/src/core/links.ts +166 -2
  489. package/src/core/manifest.ts +10 -3
  490. package/src/core/navigation.ts +115 -16
  491. package/src/core/new-tab.ts +35 -0
  492. package/src/core/node-require.ts +21 -0
  493. package/src/core/project-graph.ts +42 -26
  494. package/src/core/project.ts +9 -4
  495. package/src/core/request-body.ts +61 -0
  496. package/src/core/safe-href.ts +28 -0
  497. package/src/core/safe-links.ts +68 -0
  498. package/src/core/schema.ts +528 -745
  499. package/src/core/server-features.ts +10 -11
  500. package/src/core/sources/assets.ts +47 -11
  501. package/src/core/sources/collection.ts +67 -0
  502. package/src/core/sources/contentful-rich-text.ts +285 -0
  503. package/src/core/sources/contentful.ts +173 -0
  504. package/src/core/sources/github-releases.ts +51 -1
  505. package/src/core/sources/json.ts +71 -0
  506. package/src/core/sources/lexical.ts +195 -0
  507. package/src/core/sources/lower.ts +226 -0
  508. package/src/core/sources/normalize.ts +52 -2
  509. package/src/core/sources/notion.ts +39 -28
  510. package/src/core/sources/payload.ts +135 -0
  511. package/src/core/sources/portable-text.ts +11 -16
  512. package/src/core/sources/remote.ts +226 -0
  513. package/src/core/sources/resolve.ts +104 -166
  514. package/src/core/sources/sanity.ts +16 -49
  515. package/src/core/sources/strapi-blocks.ts +124 -0
  516. package/src/core/sources/strapi.ts +191 -0
  517. package/src/core/sources/types.ts +12 -1
  518. package/src/core/types.ts +15 -1
  519. package/src/core/ui-packs/ar.ts +10 -7
  520. package/src/core/ui-packs/bg.ts +10 -7
  521. package/src/core/ui-packs/bn.ts +10 -7
  522. package/src/core/ui-packs/ca.ts +7 -6
  523. package/src/core/ui-packs/cs.ts +10 -7
  524. package/src/core/ui-packs/da.ts +10 -7
  525. package/src/core/ui-packs/de.ts +10 -7
  526. package/src/core/ui-packs/el.ts +7 -6
  527. package/src/core/ui-packs/es.ts +7 -6
  528. package/src/core/ui-packs/fa.ts +10 -7
  529. package/src/core/ui-packs/fi.ts +10 -7
  530. package/src/core/ui-packs/fr.ts +7 -6
  531. package/src/core/ui-packs/he.ts +10 -7
  532. package/src/core/ui-packs/hi.ts +10 -7
  533. package/src/core/ui-packs/hr.ts +10 -7
  534. package/src/core/ui-packs/hu.ts +10 -7
  535. package/src/core/ui-packs/id.ts +10 -7
  536. package/src/core/ui-packs/it.ts +7 -6
  537. package/src/core/ui-packs/ja.ts +7 -6
  538. package/src/core/ui-packs/ko.ts +7 -6
  539. package/src/core/ui-packs/nl.ts +10 -7
  540. package/src/core/ui-packs/no.ts +10 -7
  541. package/src/core/ui-packs/pl.ts +10 -7
  542. package/src/core/ui-packs/pt-br.ts +7 -6
  543. package/src/core/ui-packs/pt.ts +7 -6
  544. package/src/core/ui-packs/ro.ts +10 -7
  545. package/src/core/ui-packs/ru.ts +10 -7
  546. package/src/core/ui-packs/sk.ts +10 -7
  547. package/src/core/ui-packs/sr.ts +10 -7
  548. package/src/core/ui-packs/sv.ts +10 -7
  549. package/src/core/ui-packs/th.ts +7 -6
  550. package/src/core/ui-packs/tr.ts +10 -7
  551. package/src/core/ui-packs/uk.ts +10 -7
  552. package/src/core/ui-packs/vi.ts +7 -6
  553. package/src/core/ui-packs/zh-tw.ts +7 -6
  554. package/src/core/ui-packs/zh.ts +7 -6
  555. package/src/core/unrecognized-keys.ts +10 -0
  556. package/src/core/version-cut.ts +116 -8
  557. package/src/deploy/adapter-output.ts +57 -97
  558. package/src/deploy/adapters/cloudflare.ts +39 -0
  559. package/src/deploy/adapters/index.ts +41 -0
  560. package/src/deploy/adapters/netlify.ts +34 -0
  561. package/src/deploy/adapters/node.ts +34 -0
  562. package/src/deploy/adapters/registry.ts +127 -0
  563. package/src/deploy/adapters/types.ts +92 -0
  564. package/src/deploy/adapters/vercel.ts +35 -0
  565. package/src/deploy/artifacts.ts +55 -27
  566. package/src/deploy/cloudflare-negotiation.ts +179 -100
  567. package/src/deploy/function-bundle.ts +18 -3
  568. package/src/deploy/headers.ts +124 -23
  569. package/src/deploy/node-headers.ts +198 -0
  570. package/src/deploy/platforms/cloudflare.ts +312 -0
  571. package/src/deploy/platforms/index.ts +67 -0
  572. package/src/deploy/platforms/netlify.ts +52 -0
  573. package/src/deploy/platforms/node.ts +40 -0
  574. package/src/deploy/platforms/paths.ts +42 -0
  575. package/src/deploy/platforms/static.ts +29 -0
  576. package/src/deploy/platforms/types.ts +112 -0
  577. package/src/deploy/platforms/vercel.ts +193 -0
  578. package/src/deploy/redirects.ts +30 -18
  579. package/src/deploy/robots.ts +3 -3
  580. package/src/deploy/rss.ts +2 -2
  581. package/src/deploy/sitemap.ts +2 -2
  582. package/src/deploy/vercel-negotiation.ts +2 -2
  583. package/src/eval/agents.ts +32 -1
  584. package/src/eval/findings.ts +19 -11
  585. package/src/eval/report.ts +10 -2
  586. package/src/markdown/external-links.ts +65 -0
  587. package/src/markdown/include.ts +45 -27
  588. package/src/markdown/index.ts +34 -9
  589. package/src/markdown/inline-code.ts +12 -6
  590. package/src/markdown/relative-links.ts +324 -0
  591. package/src/markdown/themes.ts +3 -3
  592. package/src/migrate/migrate.ts +149 -0
  593. package/src/openapi/parse.ts +64 -16
  594. package/src/openapi/proxy.ts +62 -10
  595. package/src/openapi/references.ts +147 -147
  596. package/src/openapi/render-mdx.ts +32 -10
  597. package/src/openapi/scalar.ts +15 -13
  598. package/src/openapi/sentence.ts +14 -0
  599. package/src/openapi/source.ts +37 -21
  600. package/src/openapi/spec-dependency-error.ts +15 -0
  601. package/src/reference/asyncapi.ts +83 -0
  602. package/src/reference/graphql.ts +89 -0
  603. package/src/reference/index.ts +40 -0
  604. package/src/reference/openapi.ts +83 -0
  605. package/src/reference/options.ts +201 -0
  606. package/src/reference/scalar.ts +136 -0
  607. package/src/reference/schema.ts +88 -0
  608. package/src/registry/eject.ts +109 -53
  609. package/src/search/adapters/algolia.ts +46 -0
  610. package/src/search/adapters/flexsearch.ts +29 -0
  611. package/src/search/adapters/index.ts +39 -0
  612. package/src/search/adapters/mixedbread.ts +39 -0
  613. package/src/search/adapters/orama-cloud.ts +51 -0
  614. package/src/search/adapters/orama.ts +24 -0
  615. package/src/search/adapters/pagefind.ts +27 -0
  616. package/src/search/adapters/registry.ts +131 -0
  617. package/src/search/adapters/types.ts +46 -0
  618. package/src/search/adapters/typesense.ts +57 -0
  619. package/src/search/build.ts +8 -4
  620. package/src/search/documents.ts +8 -2
  621. package/src/search/orama-index.ts +1 -1
  622. package/src/search/sync/algolia.ts +12 -11
  623. package/src/search/sync/index.ts +35 -20
  624. package/src/search/sync/orama-cloud.ts +12 -9
  625. package/src/search/sync/typesense.ts +15 -13
  626. package/src/sources/contentful.ts +63 -0
  627. package/src/sources/custom.ts +38 -0
  628. package/src/sources/filesystem.ts +51 -0
  629. package/src/sources/github-releases.ts +52 -0
  630. package/src/sources/index.ts +60 -0
  631. package/src/sources/mdx-remote.ts +76 -0
  632. package/src/sources/notion.ts +63 -0
  633. package/src/sources/obsidian.ts +38 -0
  634. package/src/sources/payload.ts +60 -0
  635. package/src/sources/registry.ts +182 -0
  636. package/src/sources/sanity.ts +66 -0
  637. package/src/sources/shared.ts +52 -0
  638. package/src/sources/strapi.ts +58 -0
  639. package/src/theme/entry.ts +24 -2
  640. package/src/translate/report.ts +40 -7
  641. package/src/upgrade/upgrade.ts +499 -0
  642. package/dist/cli/chunk-0qymqwzz.js +0 -164
  643. package/dist/cli/chunk-0qymqwzz.js.map +0 -15
  644. package/dist/cli/chunk-1jefwnfs.js.map +0 -48
  645. package/dist/cli/chunk-2mzebbbz.js +0 -69
  646. package/dist/cli/chunk-2z47ypj8.js.map +0 -11
  647. package/dist/cli/chunk-4x36ddpw.js.map +0 -11
  648. package/dist/cli/chunk-5093q3n7.js +0 -68
  649. package/dist/cli/chunk-5093q3n7.js.map +0 -10
  650. package/dist/cli/chunk-5qk08vmp.js.map +0 -11
  651. package/dist/cli/chunk-7s8hm3b6.js +0 -5347
  652. package/dist/cli/chunk-7s8hm3b6.js.map +0 -58
  653. package/dist/cli/chunk-8cjtbafj.js.map +0 -13
  654. package/dist/cli/chunk-97r59kpr.js +0 -381
  655. package/dist/cli/chunk-97r59kpr.js.map +0 -12
  656. package/dist/cli/chunk-ahnw3kxw.js.map +0 -15
  657. package/dist/cli/chunk-b27xqwn9.js.map +0 -10
  658. package/dist/cli/chunk-bf6bt1xt.js +0 -185
  659. package/dist/cli/chunk-bf6bt1xt.js.map +0 -11
  660. package/dist/cli/chunk-cjtn640a.js.map +0 -10
  661. package/dist/cli/chunk-ct47dqpx.js.map +0 -11
  662. package/dist/cli/chunk-esphfr8p.js +0 -107
  663. package/dist/cli/chunk-esphfr8p.js.map +0 -11
  664. package/dist/cli/chunk-ex56aa81.js +0 -1016
  665. package/dist/cli/chunk-ex56aa81.js.map +0 -13
  666. package/dist/cli/chunk-garjf5z9.js +0 -30
  667. package/dist/cli/chunk-garjf5z9.js.map +0 -10
  668. package/dist/cli/chunk-js7saxwm.js +0 -1045
  669. package/dist/cli/chunk-js7saxwm.js.map +0 -22
  670. package/dist/cli/chunk-k79xp7av.js.map +0 -39
  671. package/dist/cli/chunk-ps4m1xh4.js.map +0 -15
  672. package/dist/cli/chunk-q4rae3bg.js +0 -60
  673. package/dist/cli/chunk-q4rae3bg.js.map +0 -10
  674. package/dist/cli/chunk-rz9jmfhz.js +0 -108
  675. package/dist/cli/chunk-rz9jmfhz.js.map +0 -10
  676. package/dist/cli/chunk-vh9w1sgp.js +0 -73
  677. package/dist/cli/chunk-vh9w1sgp.js.map +0 -10
  678. package/dist/cli/chunk-vrfp10qk.js +0 -81
  679. package/dist/cli/chunk-vrfp10qk.js.map +0 -10
  680. package/dist/cli/chunk-yg63d42r.js.map +0 -34
  681. package/docs/advanced/api-reference.mdx +0 -240
  682. package/docs/configuration/ask-ai.mdx +0 -256
  683. package/docs/reference/cli.mdx +0 -197
  684. package/skills/blume-migrate/assets/oxfmt@0.55.0.patch +0 -20
  685. package/src/components/content/changelog-element.ts +0 -69
  686. package/src/search/providers.ts +0 -91
  687. /package/dist/cli/{chunk-vacwm2hv.js.map → chunk-27g6wdth.js.map} +0 -0
  688. /package/dist/cli/{chunk-dwgcp5sm.js.map → chunk-ce574jw2.js.map} +0 -0
  689. /package/dist/cli/{chunk-e7f42gdj.js.map → chunk-fxypxtvm.js.map} +0 -0
  690. /package/dist/cli/{chunk-nn13znc2.js.map → chunk-zxcczpyx.js.map} +0 -0
@@ -97,3 +97,27 @@ export const launchAgent = async (
97
97
  `Read ${promptPath} and follow its instructions exactly.`,
98
98
  ]);
99
99
  };
100
+
101
+ /**
102
+ * {@link launchAgent}, but resolving `null` instead of rejecting when the
103
+ * executable isn't on PATH, so each command can print its own install hint.
104
+ * Only `ENOENT` means "not installed" — any other spawn failure (`EACCES`,
105
+ * `EMFILE`, …) must surface as itself, not be masked by an irrelevant hint.
106
+ */
107
+ export const launchInstalledAgent = async (
108
+ bin: string,
109
+ prompt: string,
110
+ platform: NodeJS.Platform = process.platform
111
+ ): Promise<number | null> => {
112
+ try {
113
+ return await launchAgent(bin, prompt, platform);
114
+ } catch (error) {
115
+ // SAFETY: only the `code` tag is inspected; a spawn failure throws an
116
+ // ErrnoException, and any other thrown value fails the comparison and
117
+ // rethrows unchanged.
118
+ if ((error as NodeJS.ErrnoException)?.code !== "ENOENT") {
119
+ throw error;
120
+ }
121
+ return null;
122
+ }
123
+ };
@@ -668,7 +668,7 @@ export const CHECKS = [
668
668
  // audits it — they audit for Google. Blume emits it, so Blume checks it.
669
669
  {
670
670
  category: "ai",
671
- fix: "Rebuild — `ai.llmsTxt` is enabled but the build has no llms.txt. If that's intentional, set `ai.llmsTxt: false`.",
671
+ fix: "Rebuild — `agents.llmsTxt` is enabled but the build has no llms.txt. If that's intentional, set `agents.llmsTxt: false`.",
672
672
  id: "BLUME_AUDIT_LLMS_TXT_MISSING",
673
673
  severity: "warning",
674
674
  tier: "static",
@@ -806,7 +806,7 @@ export const checkMeta = (id: CheckId): CheckMeta => {
806
806
  return meta;
807
807
  };
808
808
 
809
- const DOCS_BASE = "https://useblume.dev/docs/reference/audit";
809
+ const DOCS_BASE = "https://useblume.dev/docs/cli/audit";
810
810
 
811
811
  /** `BLUME_AUDIT_TITLE_TOO_LONG` -> `…/audit#title-too-long`. */
812
812
  export const checkDocsUrl = (id: CheckId): string =>
@@ -43,12 +43,12 @@ const resolveAsset = (
43
43
  return null;
44
44
  }
45
45
 
46
- const origin = siteOrigin(context.project.config.deployment.site);
46
+ const origin = siteOrigin(context.project.config.deployment.options.site);
47
47
  const resolved = resolveHref(
48
48
  page.url,
49
49
  asset.src,
50
50
  origin,
51
- normalizeBasePath(context.project.config.deployment.base)
51
+ normalizeBasePath(context.project.config.deployment.options.base)
52
52
  );
53
53
  // A subresource on another origin (a CDN, an analytics script) is outside the
54
54
  // build; we can't check whether it exists without the network.
@@ -181,7 +181,7 @@ export const dnsAidChecks: CheckModule = {
181
181
  if (!context.origin) {
182
182
  return [];
183
183
  }
184
- const host = dnsAidHost(context.project.config.deployment.site);
184
+ const host = dnsAidHost(context.project.config.deployment.options.site);
185
185
  if (!host) {
186
186
  return [];
187
187
  }
@@ -27,7 +27,9 @@ const isNonCanonical = (page: PageSnapshot, deployBase: string): boolean => {
27
27
 
28
28
  /** Pages that can meaningfully be compared against each other for duplication. */
29
29
  const comparable = (context: AuditContext): PageSnapshot[] => {
30
- const deployBase = normalizeBasePath(context.project.config.deployment.base);
30
+ const deployBase = normalizeBasePath(
31
+ context.project.config.deployment.options.base
32
+ );
31
33
  return context.pages.filter(
32
34
  (page) =>
33
35
  page.indexable &&
@@ -7,7 +7,7 @@ import { normalizePath } from "../url.ts";
7
7
 
8
8
  /** The normalized `deployment.base` — hreflang hrefs carry it, page URLs don't. */
9
9
  const deployBaseOf = (context: AuditContext): string =>
10
- normalizeBasePath(context.project.config.deployment.base);
10
+ normalizeBasePath(context.project.config.deployment.options.base);
11
11
 
12
12
  /** The hreflang value meaning "use this when nothing else matches". Not a locale. */
13
13
  const X_DEFAULT = "x-default";
@@ -1,6 +1,6 @@
1
1
  import { normalizeBasePath, stripBasePath } from "../../core/base-path.ts";
2
- import { SITE_INFERRING_ADAPTERS } from "../../core/deployment-env.ts";
3
2
  import type { Diagnostic } from "../../core/types.ts";
3
+ import { deployPlatform } from "../../deploy/platforms/index.ts";
4
4
  import { finding } from "../catalog.ts";
5
5
  import { pageSite } from "../locate.ts";
6
6
  import { ERROR_ROUTES } from "../types.ts";
@@ -20,7 +20,7 @@ const canonicalChecks = (
20
20
  context: AuditContext,
21
21
  page: PageSnapshot
22
22
  ): Diagnostic[] => {
23
- const { site } = context.project.config.deployment;
23
+ const { site } = context.project.config.deployment.options;
24
24
  const origin = siteOrigin(site);
25
25
 
26
26
  // Error routes are noindex by design, so a canonical on them is meaningless
@@ -79,7 +79,7 @@ const canonicalChecks = (
79
79
  // comparing.
80
80
  const target = normalizePath(
81
81
  stripBasePath(
82
- normalizeBasePath(context.project.config.deployment.base),
82
+ normalizeBasePath(context.project.config.deployment.options.base),
83
83
  decodePath(canonical.pathname)
84
84
  )
85
85
  );
@@ -151,8 +151,8 @@ export const indexabilityChecks: CheckModule = {
151
151
  // cannot emit a canonical, an Open Graph image, or a sitemap on *any* page.
152
152
  // That's one fact about the config, not a defect on each of 200 pages —
153
153
  // report it once, and let the checks that depend on it stay quiet.
154
- if (!context.project.config.deployment.site) {
155
- const { adapter } = context.project.config.deployment;
154
+ if (!context.project.config.deployment.options.site) {
155
+ const { deployment } = context.project.config;
156
156
  const site = {
157
157
  file: context.project.context.configFile ?? undefined,
158
158
  url: "/",
@@ -163,11 +163,11 @@ export const indexabilityChecks: CheckModule = {
163
163
  // would duplicate state the platform owns, so the finding (which agents
164
164
  // apply verbatim via `--claude`/`--codex`) must not suggest it.
165
165
  found.push(
166
- adapter && SITE_INFERRING_ADAPTERS.has(adapter)
166
+ deployPlatform(deployment).env
167
167
  ? finding(
168
168
  "BLUME_AUDIT_SITE_INFERRED_AT_DEPLOY",
169
169
  site,
170
- `deployment.site is not set in this build — on ${adapter} it is inferred from the platform env at deploy time, so canonical URLs, Open Graph images, and the sitemap are only missing from this local artifact.`
170
+ `deployment.site is not set in this build — on ${deployment.kind} it is inferred from the platform env at deploy time, so canonical URLs, Open Graph images, and the sitemap are only missing from this local artifact.`
171
171
  )
172
172
  : finding(
173
173
  "BLUME_AUDIT_SITE_NOT_SET",
@@ -45,9 +45,9 @@ export const linkChecks: CheckModule = {
45
45
  category: "links",
46
46
  run(context) {
47
47
  const found: Diagnostic[] = [];
48
- const origin = siteOrigin(context.project.config.deployment.site);
48
+ const origin = siteOrigin(context.project.config.deployment.options.site);
49
49
  const deployBase = normalizeBasePath(
50
- context.project.config.deployment.base
50
+ context.project.config.deployment.options.base
51
51
  );
52
52
  /** Broken chrome targets, and the first page each was seen on. */
53
53
  const brokenChrome = new Map<string, PageSnapshot>();
@@ -6,16 +6,16 @@ import { ERROR_ROUTES } from "../types.ts";
6
6
  import type { AuditContext, CheckModule } from "../types.ts";
7
7
  import { isServed, normalizePath, siteOrigin } from "../url.ts";
8
8
 
9
- /** The object form of `ai.llmsTxt`. The schema always emits it, but hand-built
9
+ /** The object form of `agents.llmsTxt`. The schema always emits it, but hand-built
10
10
  * audit contexts (tests, partial configs) may still carry the raw boolean. */
11
11
  const isLlmsToggleObject = (
12
12
  value: boolean | { enabled: boolean; openapi: boolean } | undefined
13
13
  ): value is { enabled: boolean; openapi: boolean } =>
14
14
  typeof value === "object" && value !== null;
15
15
 
16
- /** The `ai.llmsTxt` config normalized to what the checks need. */
16
+ /** The `agents.llmsTxt` config normalized to what the checks need. */
17
17
  const llmsConfig = (context: AuditContext) => {
18
- const value = context.project.config.ai?.llmsTxt;
18
+ const value = context.project.config.agents?.llmsTxt;
19
19
  if (isLlmsToggleObject(value)) {
20
20
  return { enabled: value.enabled, openapi: value.openapi };
21
21
  }
@@ -82,9 +82,9 @@ export const llmsChecks: CheckModule = {
82
82
  }
83
83
 
84
84
  const found: Diagnostic[] = [];
85
- const origin = siteOrigin(context.project.config.deployment.site);
85
+ const origin = siteOrigin(context.project.config.deployment.options.site);
86
86
  const deployBase = normalizeBasePath(
87
- context.project.config.deployment.base
87
+ context.project.config.deployment.options.base
88
88
  );
89
89
 
90
90
  const listed = new Set<string>();
@@ -114,7 +114,7 @@ export const llmsChecks: CheckModule = {
114
114
  // The reverse direction, mirroring INDEXABLE_PAGE_NOT_IN_SITEMAP: a page
115
115
  // that is built, indexable, and in the nav belongs in the index. Pages the
116
116
  // generator deliberately skips — hidden, drafts, error routes, API
117
- // reference when `ai.llmsTxt.openapi` is off, custom pages with no
117
+ // reference when `agents.llmsTxt.openapi` is off, custom pages with no
118
118
  // manifest route — are skipped here for the same reasons.
119
119
  for (const page of context.pages) {
120
120
  const { route } = page;
@@ -153,7 +153,7 @@ export const networkChecks: CheckModule = {
153
153
 
154
154
  const found: Diagnostic[] = [];
155
155
  const deployBase = normalizeBasePath(
156
- context.project.config.deployment.base
156
+ context.project.config.deployment.options.base
157
157
  );
158
158
  const targets = context.pages.map((page) =>
159
159
  liveUrl(origin, page, deployBase)
@@ -217,9 +217,9 @@ export const networkChecks: CheckModule = {
217
217
  export const externalChecks: CheckModule = {
218
218
  category: "network",
219
219
  async run(context) {
220
- const origin = siteOrigin(context.project.config.deployment.site);
220
+ const origin = siteOrigin(context.project.config.deployment.options.site);
221
221
  const deployBase = normalizeBasePath(
222
- context.project.config.deployment.base
222
+ context.project.config.deployment.options.base
223
223
  );
224
224
 
225
225
  /** Every outbound URL, and the pages that link to it. */
@@ -53,9 +53,9 @@ export const ogImageChecks: CheckModule = {
53
53
  return pending;
54
54
  };
55
55
 
56
- const origin = siteOrigin(context.project.config.deployment.site);
56
+ const origin = siteOrigin(context.project.config.deployment.options.site);
57
57
  const deployBase = normalizeBasePath(
58
- context.project.config.deployment.base
58
+ context.project.config.deployment.options.base
59
59
  );
60
60
  const candidates: { page: PageSnapshot; path: string }[] = [];
61
61
 
@@ -23,7 +23,7 @@ export const robotsChecks: CheckModule = {
23
23
  category: "robots",
24
24
  run(context) {
25
25
  const { robots } = context;
26
- const { site } = context.project.config.deployment;
26
+ const { site } = context.project.config.deployment.options;
27
27
 
28
28
  if (!context.project.config.seo.robots) {
29
29
  return [];
@@ -150,7 +150,7 @@ export const sitemapChecks: CheckModule = {
150
150
  category: "sitemap",
151
151
  run(context) {
152
152
  const { sitemap } = context;
153
- const { site } = context.project.config.deployment;
153
+ const { site } = context.project.config.deployment.options;
154
154
 
155
155
  // Without `deployment.site` Blume can't emit a sitemap at all (absolute URLs
156
156
  // are required), and that's a config choice, not a defect. Stay quiet.
@@ -220,7 +220,7 @@ export const sitemapChecks: CheckModule = {
220
220
 
221
221
  const origin = siteOrigin(site);
222
222
  const deployBase = normalizeBasePath(
223
- context.project.config.deployment.base
223
+ context.project.config.deployment.options.base
224
224
  );
225
225
  const listed = sitemapPaths(context, deployBase);
226
226
 
@@ -27,7 +27,7 @@ export const socialChecks: CheckModule = {
27
27
  category: "social",
28
28
  run(context) {
29
29
  const found: Diagnostic[] = [];
30
- const hasSite = Boolean(context.project.config.deployment.site);
30
+ const hasSite = Boolean(context.project.config.deployment.options.site);
31
31
  const required = ogRequired(hasSite);
32
32
 
33
33
  for (const page of context.pages) {
package/src/audit/run.ts CHANGED
@@ -29,6 +29,7 @@ import {
29
29
  import { crawlStaticDir } from "./crawl.ts";
30
30
  import { buildGraph } from "./graph.ts";
31
31
  import { resolveRedirects } from "./redirects.ts";
32
+ import { shortId } from "./terms.ts";
32
33
  import { DEFAULT_THRESHOLDS } from "./types.ts";
33
34
  import type {
34
35
  AuditContext,
@@ -119,7 +120,7 @@ const readSources = async (
119
120
  /** Does a check id or its category match one of the user's `--only`/`--skip` terms? */
120
121
  const matches = (id: CheckId, terms: string[]): boolean => {
121
122
  const meta = CHECKS.find((check) => check.id === id);
122
- const short = id.replace("BLUME_AUDIT_", "").toLowerCase();
123
+ const short = shortId(id);
123
124
  return terms.some((raw) => {
124
125
  const term = raw.trim().toLowerCase();
125
126
  return (
@@ -150,8 +151,8 @@ export const runAudit = async (options: AuditOptions): Promise<AuditResult> => {
150
151
  files: crawl.files,
151
152
  graph: buildGraph(
152
153
  crawl.pages,
153
- siteOrigin(project.config.deployment.site),
154
- normalizeBasePath(project.config.deployment.base)
154
+ siteOrigin(project.config.deployment.options.site),
155
+ normalizeBasePath(project.config.deployment.options.base)
155
156
  ),
156
157
  llms: crawl.llms,
157
158
  origin,
@@ -0,0 +1,31 @@
1
+ import { CHECKS } from "./catalog.ts";
2
+ import type { CheckId } from "./catalog.ts";
3
+
4
+ /** A check id without its `BLUME_AUDIT_` prefix, lowercased: `link_to_broken`. */
5
+ export const shortId = (id: CheckId): string =>
6
+ id.replace("BLUME_AUDIT_", "").toLowerCase();
7
+
8
+ /**
9
+ * Every term `--only`/`--skip` accept, as the audit's filter compares them:
10
+ * each check's short id and each category. The full `BLUME_AUDIT_…` id is
11
+ * accepted too, but it's the short id with a prefix, so it isn't listed.
12
+ */
13
+ export const checkTerms = (): string[] => [
14
+ ...new Set([
15
+ ...CHECKS.map((check) => check.category),
16
+ ...CHECKS.map((check) => shortId(check.id)),
17
+ ]),
18
+ ];
19
+
20
+ /**
21
+ * The `--only`/`--skip` terms that name no check and no category. A typo there
22
+ * (`--only link` for `links`) would otherwise match nothing, report nothing,
23
+ * and pass a CI gate that was meant to catch something.
24
+ */
25
+ export const unknownCheckTerms = (terms: readonly string[]): string[] => {
26
+ const known = new Set(checkTerms());
27
+ return terms.filter((raw) => {
28
+ const term = raw.trim().toLowerCase();
29
+ return !(known.has(term) || known.has(term.replace(/^blume_audit_/u, "")));
30
+ });
31
+ };
package/src/audit/url.ts CHANGED
@@ -11,16 +11,16 @@ export type ServedContext = Pick<AuditContext, "byUrl" | "files" | "project">;
11
11
  /**
12
12
  * Routes the server answers that the build writes no file for.
13
13
  *
14
- * The MCP endpoint is streamable HTTP: llms.txt advertises `ai.mcp.route`
14
+ * The MCP endpoint is streamable HTTP: llms.txt advertises `agents.mcp.route`
15
15
  * whenever the server is enabled, but it appears in neither the page snapshots
16
16
  * nor the static file index, so a check that only consults those reads the
17
17
  * site's own index as broken. The exemption is the configured route while the
18
- * server is on, and nothing wider — with `ai.mcp` off, a listed `/mcp` is as
18
+ * server is on, and nothing wider — with `agents.mcp` off, a listed `/mcp` is as
19
19
  * dead as any other missing target. Any future server route (a search API, a
20
20
  * playground proxy) belongs here too, so every check recognizes it at once.
21
21
  */
22
22
  const serverRoutes = (context: ServedContext): string[] => {
23
- const mcp = context.project.config.ai?.mcp;
23
+ const mcp = context.project.config.agents?.mcp;
24
24
  return mcp?.enabled ? [normalizePath(mcp.route)] : [];
25
25
  };
26
26
 
@@ -124,16 +124,16 @@ export const resolveHref = (
124
124
  return { kind: "external", url: parsed.toString() };
125
125
  }
126
126
 
127
- // A relative href resolves against the page's own URL. `URL` needs an origin
128
- // to do that, so borrow a placeholder one and keep only the path. The base
129
- // carries a trailing slash because Astro's directory build serves `/docs/api`
130
- // at `/docs/api/` — so in a browser `./auth` there means `/docs/api/auth`, not
131
- // `/docs/auth`. Resolving against the slashless form would silently mis-target
132
- // every relative link on the site by one directory level.
133
- const base =
134
- pageUrl === "/"
135
- ? "https://blume.invalid/"
136
- : `https://blume.invalid${pageUrl}/`;
127
+ // A relative href resolves the way a browser resolves it from the page's
128
+ // canonical URL. `URL` needs an origin to do that, so borrow a placeholder
129
+ // one and keep only the path. The canonical URL is slashless — the generated
130
+ // config sets `trailingSlash: "never"`, Vercel redirects `/docs/api/` onto
131
+ // `/docs/api`, and the dev server 404s the slashed form — so `./auth` there
132
+ // means `/docs/auth`, exactly where a reader's click lands. Content links
133
+ // never hit this: the Markdown pipeline rewrites them root-relative (see
134
+ // `resolveRelativeHref`); what's left is hand-written HTML, which a browser
135
+ // reads this way.
136
+ const base = `https://blume.invalid${pageUrl}`;
137
137
  let resolved: URL;
138
138
  try {
139
139
  resolved = new URL(target, base);
@@ -18,9 +18,9 @@ declare module "blume:search-client" {
18
18
  declare module "blume:ask" {
19
19
  /** The generated Ask trigger (see `askComponentTemplate`); empty when Ask is off. */
20
20
  // Mirrors the generated `.blume/src/env.d.ts` declaration: the trigger's type
21
- // is the AskAI island the enabled template re-exports.
21
+ // is the Assistant island the enabled template re-exports.
22
22
  // oxlint-disable-next-line typescript/consistent-type-imports
23
- const Ask: typeof import("./components/islands/AskAI.astro").default;
23
+ const Ask: typeof import("./components/islands/Assistant.astro").default;
24
24
  export default Ask;
25
25
  }
26
26
 
@@ -53,6 +53,11 @@ export const commandMeta = {
53
53
  "Serve an MCP data snapshot over stdio (internal, used by `blume eval`).",
54
54
  name: "mcp-stdio",
55
55
  },
56
+ migrate: {
57
+ description:
58
+ "Migrate a docs site from Mintlify, Fumadocs, Docusaurus, Starlight, or Nextra with a coding agent.",
59
+ name: "migrate",
60
+ },
56
61
  preview: {
57
62
  description: "Preview the last production build.",
58
63
  name: "preview",
@@ -66,6 +71,11 @@ export const commandMeta = {
66
71
  "Translate docs into the configured locales with a local agent CLI.",
67
72
  name: "translate",
68
73
  },
74
+ upgrade: {
75
+ description:
76
+ "Upgrade to this version of Blume: bump the dependency and list the config changes left.",
77
+ name: "upgrade",
78
+ },
69
79
  validate: {
70
80
  description: "Validate internal, anchor, asset, and external links.",
71
81
  name: "validate",
@@ -3,19 +3,21 @@ import { defineCommand } from "citty";
3
3
  import {
4
4
  AGENTS,
5
5
  fixPrompt,
6
- launchAgent,
6
+ launchInstalledAgent,
7
7
  writeAgentReport,
8
8
  } from "../../audit/agent.ts";
9
9
  import type { AgentKind } from "../../audit/agent.ts";
10
10
  import { formatCatalog, formatReport, reportJson } from "../../audit/report.ts";
11
11
  import { NoBuildError, runAudit } from "../../audit/run.ts";
12
12
  import type { AuditResult } from "../../audit/run.ts";
13
+ import { checkTerms, unknownCheckTerms } from "../../audit/terms.ts";
13
14
  import { BlumeError } from "../../core/diagnostics.ts";
14
15
  import { scanProject } from "../../core/project-graph.ts";
15
16
  import type { DiagnosticSeverity } from "../../core/types.ts";
16
17
  import { commandMeta } from "../command-meta.ts";
17
18
  import { reportInternalError } from "../internal-error.ts";
18
- import { flushStdout, logger } from "../log.ts";
19
+ import { flushStdout, logger, reportDiagnostics } from "../log.ts";
20
+ import { closestMatch } from "../unknown-flags.ts";
19
21
 
20
22
  const SEVERITIES: DiagnosticSeverity[] = ["error", "warning", "info"];
21
23
 
@@ -31,6 +33,31 @@ const splitTerms = (value: string | undefined): string[] =>
31
33
  .filter(Boolean)
32
34
  : [];
33
35
 
36
+ /**
37
+ * Exit when `--only`/`--skip` name a check or category that doesn't exist,
38
+ * suggesting the closest real one — a typo would otherwise filter every
39
+ * finding out and pass the gate.
40
+ */
41
+ const rejectUnknownTerms = (terms: string[]): void => {
42
+ const unknown = unknownCheckTerms(terms);
43
+ if (unknown.length === 0) {
44
+ return;
45
+ }
46
+ const known = checkTerms();
47
+ const listed = unknown
48
+ .map((term) => {
49
+ const suggestion = closestMatch(term.trim().toLowerCase(), known);
50
+ return suggestion
51
+ ? `"${term}" (did you mean "${suggestion}"?)`
52
+ : `"${term}"`;
53
+ })
54
+ .join(", ");
55
+ logger.error(
56
+ `--only/--skip name no check or category: ${listed}. Run \`blume audit --list-checks\` for every check id and category.`
57
+ );
58
+ process.exit(1);
59
+ };
60
+
34
61
  /** Whether the run should exit non-zero, given the gate. */
35
62
  export const shouldFail = (
36
63
  result: AuditResult,
@@ -40,31 +67,20 @@ export const shouldFail = (
40
67
  return result.diagnostics.some((d) => failing.has(d.severity));
41
68
  };
42
69
 
43
- /**
44
- * Launch the agent CLI, turning a missing executable into the install hint.
45
- * Only `ENOENT` means "not installed" — any other spawn failure (`EACCES`,
46
- * `EMFILE`, …) must surface as itself, not be masked by an irrelevant
47
- * install hint.
48
- */
70
+ /** Launch the agent CLI, turning a missing executable into the install hint. */
49
71
  const launchAgentCode = async (
50
72
  agent: AgentKind,
51
73
  prompt: string
52
74
  ): Promise<number> => {
53
75
  const cli = AGENTS[agent];
54
- try {
55
- return await launchAgent(cli.bin, prompt);
56
- } catch (error) {
57
- // SAFETY: only the `code` tag is inspected; a spawn failure throws an
58
- // ErrnoException, and any other thrown value fails the comparison and
59
- // rethrows unchanged.
60
- if ((error as NodeJS.ErrnoException)?.code !== "ENOENT") {
61
- throw error;
62
- }
76
+ const code = await launchInstalledAgent(cli.bin, prompt);
77
+ if (code === null) {
63
78
  logger.error(
64
79
  `${cli.name} (\`${cli.bin}\`) was not found on PATH. Install it with \`${cli.install}\`.`
65
80
  );
66
81
  return process.exit(1);
67
82
  }
83
+ return code;
68
84
  };
69
85
 
70
86
  export const auditCommand = defineCommand({
@@ -138,7 +154,7 @@ export const auditCommand = defineCommand({
138
154
  (kind) => args[kind]
139
155
  );
140
156
  if (agents.length > 1) {
141
- logger.error("Pass at most one of --claude or --codex.");
157
+ logger.error("Pass at most one of --codex or --claude.");
142
158
  process.exit(1);
143
159
  }
144
160
  const [agent] = agents;
@@ -146,6 +162,9 @@ export const auditCommand = defineCommand({
146
162
  logger.error(`--json and --${agent} are mutually exclusive.`);
147
163
  process.exit(1);
148
164
  }
165
+ const only = splitTerms(args.only);
166
+ const skip = splitTerms(args.skip);
167
+ rejectUnknownTerms([...only, ...skip]);
149
168
  let result: AuditResult;
150
169
  try {
151
170
  // `scanProject`, not `prepareProject`: the audit reads the *existing*
@@ -154,10 +173,10 @@ export const auditCommand = defineCommand({
154
173
  const project = await scanProject(root, { mode: "build" });
155
174
  result = await runAudit({
156
175
  external: args.external,
157
- only: splitTerms(args.only),
176
+ only,
158
177
  origin: args.url,
159
178
  project,
160
- skip: splitTerms(args.skip),
179
+ skip,
161
180
  });
162
181
  } catch (error) {
163
182
  if (error instanceof NoBuildError) {
@@ -165,7 +184,7 @@ export const auditCommand = defineCommand({
165
184
  process.exit(1);
166
185
  }
167
186
  if (error instanceof BlumeError) {
168
- logger.error(error.diagnostic.message);
187
+ reportDiagnostics([error.diagnostic], root);
169
188
  process.exit(1);
170
189
  }
171
190
  reportInternalError(error);