blume 2.1.2 → 2.2.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 (377) hide show
  1. package/AGENTS.md +1 -1
  2. package/CHANGELOG.md +133 -0
  3. package/README.md +4 -4
  4. package/dist/cli/{chunk-74wfhv79.js → chunk-05f21r8h.js} +1 -1
  5. package/dist/cli/{chunk-9qzgg6mj.js → chunk-1cm0h819.js} +3 -3
  6. package/dist/cli/{chunk-nbyvgnnm.js → chunk-1rkxzg3n.js} +104 -47
  7. package/dist/cli/chunk-1rkxzg3n.js.map +36 -0
  8. package/dist/cli/{chunk-desvm72z.js → chunk-2nr29y95.js} +22 -26
  9. package/dist/cli/chunk-2nr29y95.js.map +13 -0
  10. package/dist/cli/{chunk-32khwcb6.js → chunk-49r370mb.js} +42 -69
  11. package/dist/cli/{chunk-32khwcb6.js.map → chunk-49r370mb.js.map} +9 -10
  12. package/dist/cli/{chunk-ms9z66nz.js → chunk-4rftmttv.js} +2 -2
  13. package/dist/cli/{chunk-s0bdnc7v.js → chunk-79bzzkx4.js} +5 -4
  14. package/dist/cli/chunk-79bzzkx4.js.map +10 -0
  15. package/dist/cli/{chunk-hvcxng5f.js → chunk-7tekknev.js} +6 -6
  16. package/dist/cli/{chunk-dv2z0rzf.js → chunk-8b489v1b.js} +38 -13
  17. package/dist/cli/{chunk-dv2z0rzf.js.map → chunk-8b489v1b.js.map} +5 -4
  18. package/dist/cli/{chunk-0pmb4tr4.js → chunk-8f8xw4x2.js} +1195 -222
  19. package/dist/cli/chunk-8f8xw4x2.js.map +44 -0
  20. package/dist/cli/chunk-96snx8yy.js +329 -0
  21. package/dist/cli/chunk-96snx8yy.js.map +13 -0
  22. package/dist/cli/{chunk-ckrcm08h.js → chunk-a3ydrqny.js} +48 -62
  23. package/dist/cli/{chunk-ckrcm08h.js.map → chunk-a3ydrqny.js.map} +4 -5
  24. package/dist/cli/{chunk-bxwhtvw8.js → chunk-ahc5gc9h.js} +5 -5
  25. package/dist/cli/{chunk-dpy8qdjf.js → chunk-as09pafp.js} +73 -182
  26. package/dist/cli/chunk-as09pafp.js.map +18 -0
  27. package/dist/cli/{chunk-tfycddbt.js → chunk-bjk964fp.js} +2 -2
  28. package/dist/cli/{chunk-gfc5fqvf.js → chunk-br0n8n3e.js} +18 -18
  29. package/dist/cli/{chunk-gfc5fqvf.js.map → chunk-br0n8n3e.js.map} +1 -1
  30. package/dist/cli/{chunk-297ajdcv.js → chunk-c69tw29j.js} +6 -6
  31. package/dist/cli/{chunk-297ajdcv.js.map → chunk-c69tw29j.js.map} +3 -3
  32. package/dist/cli/chunk-cn3dy3hz.js +146 -0
  33. package/dist/cli/chunk-cn3dy3hz.js.map +11 -0
  34. package/dist/cli/{chunk-124fvmzq.js → chunk-dm4mg9bj.js} +11064 -8742
  35. package/dist/cli/{chunk-124fvmzq.js.map → chunk-dm4mg9bj.js.map} +78 -64
  36. package/dist/cli/{chunk-dqhg54mr.js → chunk-dmx6cezx.js} +1 -1
  37. package/dist/cli/{chunk-60hz265r.js → chunk-dpcahcrb.js} +24 -11
  38. package/dist/cli/chunk-dpcahcrb.js.map +10 -0
  39. package/dist/cli/{chunk-a57yh0h9.js → chunk-dyk3r7jw.js} +7 -7
  40. package/dist/cli/{chunk-a57yh0h9.js.map → chunk-dyk3r7jw.js.map} +1 -1
  41. package/dist/cli/{chunk-twy7psdz.js → chunk-enk76qd5.js} +14 -10
  42. package/dist/cli/chunk-enk76qd5.js.map +10 -0
  43. package/dist/cli/{chunk-k3gr1nm9.js → chunk-fqy4n3q2.js} +13 -16
  44. package/dist/cli/{chunk-k3gr1nm9.js.map → chunk-fqy4n3q2.js.map} +3 -3
  45. package/dist/cli/{chunk-sc93apfs.js → chunk-frk2wdq1.js} +17 -17
  46. package/dist/cli/{chunk-sc93apfs.js.map → chunk-frk2wdq1.js.map} +2 -2
  47. package/dist/cli/{chunk-kdpzw38a.js → chunk-gprwej7h.js} +95 -7
  48. package/dist/cli/chunk-gprwej7h.js.map +11 -0
  49. package/dist/cli/chunk-kkrteb15.js +157 -0
  50. package/dist/cli/chunk-kkrteb15.js.map +10 -0
  51. package/dist/cli/{chunk-ave1wcbr.js → chunk-m9bp2hc1.js} +1 -1
  52. package/dist/cli/{chunk-58bt3hag.js → chunk-mrvh4c88.js} +4 -4
  53. package/dist/cli/{chunk-5cmts6dv.js → chunk-p8zg3a2h.js} +7 -7
  54. package/dist/cli/{chunk-5cmts6dv.js.map → chunk-p8zg3a2h.js.map} +1 -1
  55. package/dist/cli/{chunk-0w6hs479.js → chunk-rkqae7kh.js} +30 -18
  56. package/dist/cli/chunk-rkqae7kh.js.map +10 -0
  57. package/dist/cli/{chunk-bqxaqn5p.js → chunk-t5xx74rd.js} +8 -8
  58. package/dist/cli/{chunk-bqxaqn5p.js.map → chunk-t5xx74rd.js.map} +1 -1
  59. package/dist/cli/{chunk-1f882900.js → chunk-th0pgaj5.js} +2 -2
  60. package/dist/cli/{chunk-dhwtqnnd.js → chunk-vnbvhgmd.js} +2 -2
  61. package/dist/cli/{chunk-gxtg6ed2.js → chunk-vzy9rh6y.js} +21 -21
  62. package/dist/cli/{chunk-gxtg6ed2.js.map → chunk-vzy9rh6y.js.map} +3 -3
  63. package/dist/cli/{chunk-j1x92mx9.js → chunk-w6e455pz.js} +1 -1
  64. package/dist/cli/chunk-wehv26ry.js +155 -0
  65. package/dist/cli/chunk-wehv26ry.js.map +11 -0
  66. package/dist/cli/{chunk-y4msrwm9.js → chunk-xgq4eytj.js} +15 -15
  67. package/dist/cli/{chunk-36bxs9c7.js → chunk-xt0qvz1t.js} +27 -23
  68. package/dist/cli/chunk-xt0qvz1t.js.map +10 -0
  69. package/dist/cli/index.js +78 -42
  70. package/dist/cli/index.js.map +7 -6
  71. package/dist/types/ai/changelog-components.d.ts +18 -0
  72. package/dist/types/ai/changelog-markdown.d.ts +12 -0
  73. package/dist/types/ai/openapi-components.d.ts +7 -7
  74. package/dist/types/ai/operation-details.d.ts +39 -0
  75. package/dist/types/ai/relative-links.d.ts +3 -1
  76. package/dist/types/ai/serializers.d.ts +6 -4
  77. package/dist/types/analytics/head.d.ts +4 -2
  78. package/dist/types/analytics/script.d.ts +8 -2
  79. package/dist/types/components/content/youtube.d.ts +20 -0
  80. package/dist/types/components/layout/nav-utils.d.ts +8 -0
  81. package/dist/types/components/openapi/example-panels.d.ts +33 -0
  82. package/dist/types/components/openapi/helpers.d.ts +53 -11
  83. package/dist/types/components/openapi/snippets.d.ts +7 -1
  84. package/dist/types/core/alert-diagnostics.d.ts +10 -0
  85. package/dist/types/core/builtin-tags.d.ts +16 -0
  86. package/dist/types/core/changelog-list.d.ts +48 -0
  87. package/dist/types/core/closest-match.d.ts +6 -0
  88. package/dist/types/core/code-fence-diagnostics.d.ts +18 -0
  89. package/dist/types/core/code-fences.d.ts +8 -1
  90. package/dist/types/core/config-input.d.ts +1 -1
  91. package/dist/types/core/content-assets.d.ts +16 -18
  92. package/dist/types/core/diagnostics.d.ts +14 -0
  93. package/dist/types/core/directive-diagnostics.d.ts +22 -8
  94. package/dist/types/core/former-routes.d.ts +14 -0
  95. package/dist/types/core/github.d.ts +5 -4
  96. package/dist/types/core/heading-markers.d.ts +65 -2
  97. package/dist/types/core/hidden-pages.d.ts +3 -0
  98. package/dist/types/core/includes.d.ts +23 -0
  99. package/dist/types/core/last-modified.d.ts +18 -6
  100. package/dist/types/core/links.d.ts +42 -2
  101. package/dist/types/core/load-module.d.ts +19 -4
  102. package/dist/types/core/manifest.d.ts +14 -1
  103. package/dist/types/core/markdown-mirrors.d.ts +22 -0
  104. package/dist/types/core/mdx-elements.d.ts +32 -0
  105. package/dist/types/core/mdx-syntax.d.ts +100 -0
  106. package/dist/types/core/meta-diagnostics.d.ts +7 -0
  107. package/dist/types/core/meta.d.ts +32 -5
  108. package/dist/types/core/nav-diagnostics.d.ts +9 -2
  109. package/dist/types/core/navigation.d.ts +13 -0
  110. package/dist/types/core/ordering-prefix.d.ts +6 -0
  111. package/dist/types/core/pinned-ids.d.ts +23 -0
  112. package/dist/types/core/project-graph.d.ts +9 -1
  113. package/dist/types/core/redirect-patterns.d.ts +18 -0
  114. package/dist/types/core/relative-files.d.ts +31 -0
  115. package/dist/types/core/schema.d.ts +267 -7
  116. package/dist/types/core/sources/normalize.d.ts +101 -9
  117. package/dist/types/core/sources/types.d.ts +16 -0
  118. package/dist/types/core/static-files.d.ts +10 -0
  119. package/dist/types/core/static-host.d.ts +42 -0
  120. package/dist/types/core/svg-images.d.ts +26 -0
  121. package/dist/types/core/syntax-diagnostics.d.ts +14 -0
  122. package/dist/types/core/types.d.ts +42 -1
  123. package/dist/types/deploy/generated-files.d.ts +41 -0
  124. package/dist/types/deploy/redirects.d.ts +21 -7
  125. package/dist/types/markdown/code-title.d.ts +9 -5
  126. package/dist/types/markdown/directives.d.ts +8 -0
  127. package/dist/types/markdown/fence-language.d.ts +51 -0
  128. package/dist/types/markdown/fence-meta.d.ts +5 -0
  129. package/dist/types/markdown/github-alerts.d.ts +35 -0
  130. package/dist/types/openapi/asyncapi.d.ts +6 -5
  131. package/dist/types/openapi/checks.d.ts +10 -5
  132. package/dist/types/openapi/model.d.ts +55 -8
  133. package/dist/types/openapi/parse.d.ts +4 -1
  134. package/dist/types/sources/filesystem.d.ts +14 -4
  135. package/dist/types/sources/mdx-remote.d.ts +6 -3
  136. package/dist/types/sources/registry.d.ts +3 -3
  137. package/dist/types/theme/color.d.ts +33 -0
  138. package/dist/types/theme/palette.d.ts +122 -0
  139. package/docs/01-quickstart.mdx +1 -1
  140. package/docs/02-deployment.mdx +23 -8
  141. package/docs/04-migrating.mdx +16 -4
  142. package/docs/advanced/changelog.mdx +27 -1
  143. package/docs/advanced/skills.mdx +1 -1
  144. package/docs/cli/audit.mdx +1 -1
  145. package/docs/cli/doctor.mdx +2 -2
  146. package/docs/cli/evals.mdx +1 -1
  147. package/docs/cli/index.mdx +4 -2
  148. package/docs/cli/validate.mdx +10 -7
  149. package/docs/configuration/analytics.mdx +2 -0
  150. package/docs/configuration/customization.mdx +3 -1
  151. package/docs/configuration/index.mdx +2 -2
  152. package/docs/configuration/theming.mdx +5 -1
  153. package/docs/content/components.mdx +26 -6
  154. package/docs/content/frontmatter.mdx +1 -1
  155. package/docs/content/includes.mdx +6 -2
  156. package/docs/content/index.mdx +11 -1
  157. package/docs/content/islands.mdx +2 -0
  158. package/docs/content/meta.mdx +9 -3
  159. package/docs/content/navigation.mdx +14 -6
  160. package/docs/content/sources/obsidian.mdx +1 -1
  161. package/docs/content/sources/remote-mdx.mdx +3 -1
  162. package/docs/content/syntax.mdx +76 -8
  163. package/docs/content/variables.mdx +3 -1
  164. package/docs/discoverability/agent-discovery.mdx +1 -1
  165. package/docs/discoverability/json-api.mdx +1 -1
  166. package/docs/discoverability/llms-txt.mdx +1 -1
  167. package/docs/discoverability/markdown.mdx +2 -2
  168. package/docs/discoverability/open-graph.mdx +1 -1
  169. package/docs/discoverability/sitemap-and-robots.mdx +1 -1
  170. package/docs/references/graphql.mdx +2 -0
  171. package/docs/references/openapi.mdx +45 -7
  172. package/package.json +10 -9
  173. package/skills/blume/SKILL.md +2 -2
  174. package/skills/blume-migrate/SKILL.md +49 -27
  175. package/skills/blume-migrate/references/docsify.md +262 -0
  176. package/skills/blume-migrate/references/docus.md +298 -0
  177. package/skills/blume-migrate/references/docusaurus.md +3 -3
  178. package/skills/blume-migrate/references/fern.md +327 -0
  179. package/skills/blume-migrate/references/fumadocs.md +1 -1
  180. package/skills/blume-migrate/references/gitbook.md +267 -0
  181. package/skills/blume-migrate/references/github-wiki.md +259 -0
  182. package/skills/blume-migrate/references/jekyll.md +253 -0
  183. package/skills/blume-migrate/references/mdbook.md +256 -0
  184. package/skills/blume-migrate/references/mintlify.md +5 -5
  185. package/skills/blume-migrate/references/mkdocs.md +236 -0
  186. package/skills/blume-migrate/references/monorepo.md +20 -8
  187. package/skills/blume-migrate/references/nextra.md +2 -2
  188. package/skills/blume-migrate/references/readme.md +257 -0
  189. package/skills/blume-migrate/references/redocly.md +198 -0
  190. package/skills/blume-migrate/references/starlight.md +3 -3
  191. package/skills/blume-migrate/references/vitepress.md +204 -0
  192. package/skills/blume-migrate/references/vuepress.md +271 -0
  193. package/skills/blume-migrate/scripts/docsify-codemod.mjs +2387 -0
  194. package/skills/blume-migrate/scripts/docus-codemod.mjs +2542 -0
  195. package/skills/blume-migrate/scripts/fern-codemod.mjs +2633 -0
  196. package/skills/blume-migrate/scripts/github-wiki-codemod.mjs +2808 -0
  197. package/skills/blume-migrate/scripts/include-excerpts.mjs +649 -0
  198. package/skills/blume-migrate/scripts/jekyll-codemod.mjs +3649 -0
  199. package/skills/blume-migrate/scripts/mintlify-codemod.mjs +17 -13
  200. package/skills/blume-migrate/scripts/mkdocs-codemod.mjs +2526 -0
  201. package/skills/blume-migrate/scripts/operation-routes.mjs +508 -0
  202. package/skills/blume-migrate/scripts/pin-heading-ids.mjs +1049 -0
  203. package/skills/blume-migrate/scripts/readme-codemod.mjs +4139 -0
  204. package/skills/blume-migrate/scripts/vitepress-codemod.mjs +1511 -0
  205. package/src/ai/changelog-components.ts +24 -0
  206. package/src/ai/changelog-markdown.ts +45 -41
  207. package/src/ai/component-markdown.ts +22 -9
  208. package/src/ai/llms.ts +36 -5
  209. package/src/ai/markdown.ts +2 -2
  210. package/src/ai/openapi-components.ts +25 -9
  211. package/src/ai/operation-details.ts +208 -0
  212. package/src/ai/relative-links.ts +48 -8
  213. package/src/ai/serializers.ts +7 -6
  214. package/src/ai/site-skill.ts +6 -2
  215. package/src/analytics/head.ts +11 -5
  216. package/src/analytics/script.ts +13 -3
  217. package/src/astro/generate.ts +32 -6
  218. package/src/astro/index.ts +1 -0
  219. package/src/astro/integration.ts +27 -1
  220. package/src/astro/mdx-source-errors.ts +46 -0
  221. package/src/astro/templates.ts +89 -185
  222. package/src/audit/checks/redirects.ts +5 -1
  223. package/src/audit/redirects.ts +36 -19
  224. package/src/audit/report.ts +22 -9
  225. package/src/audit/run.ts +12 -28
  226. package/src/audit/terms.ts +23 -0
  227. package/src/audit/url.ts +2 -2
  228. package/src/cli/build-failure.ts +256 -7
  229. package/src/cli/command-meta.ts +1 -1
  230. package/src/cli/commands/audit.ts +1 -1
  231. package/src/cli/commands/build.ts +12 -3
  232. package/src/cli/commands/check.ts +13 -2
  233. package/src/cli/commands/dev.ts +1 -1
  234. package/src/cli/commands/doctor.ts +4 -2
  235. package/src/cli/commands/init.ts +3 -3
  236. package/src/cli/commands/preview.ts +17 -1
  237. package/src/cli/commands/validate.ts +22 -10
  238. package/src/cli/prepare.ts +1 -1
  239. package/src/cli/preview-pages.ts +161 -0
  240. package/src/cli/unknown-flags.ts +1 -42
  241. package/src/components/code-copy.ts +51 -0
  242. package/src/components/code-language.ts +75 -0
  243. package/src/components/content/AccordionItem.astro +16 -1
  244. package/src/components/content/Callout.astro +11 -1
  245. package/src/components/content/Changelog.astro +189 -0
  246. package/src/components/content/CodeBlock.astro +8 -11
  247. package/src/components/content/Tabs.astro +16 -2
  248. package/src/components/content/YouTube.astro +6 -4
  249. package/src/components/content/code-block.ts +33 -0
  250. package/src/components/content/content-strings.ts +5 -1
  251. package/src/components/content/inline-markdown.ts +35 -8
  252. package/src/components/content/youtube.ts +49 -7
  253. package/src/components/layout/Analytics.astro +5 -1
  254. package/src/components/layout/NavTree.astro +8 -3
  255. package/src/components/layout/RootLayout.astro +18 -31
  256. package/src/components/layout/nav-utils.ts +14 -0
  257. package/src/components/layout/search/pagefind.ts +2 -1
  258. package/src/components/openapi/Operation.astro +4 -0
  259. package/src/components/openapi/PanelTabs.astro +9 -3
  260. package/src/components/openapi/RequestBody.astro +42 -8
  261. package/src/components/openapi/RequestPanel.astro +34 -53
  262. package/src/components/openapi/example-panels.ts +110 -0
  263. package/src/components/openapi/helpers.ts +195 -20
  264. package/src/components/openapi/operation-model.ts +63 -26
  265. package/src/components/openapi/request.ts +13 -0
  266. package/src/components/openapi/snippets.ts +14 -2
  267. package/src/core/alert-diagnostics.ts +89 -0
  268. package/src/core/builtin-tags.ts +76 -0
  269. package/src/core/changelog-list.ts +87 -0
  270. package/src/core/closest-match.ts +41 -0
  271. package/src/core/code-fence-diagnostics.ts +267 -0
  272. package/src/core/code-fences.ts +43 -7
  273. package/src/core/component-diagnostics.ts +65 -12
  274. package/src/core/config-input.ts +1 -1
  275. package/src/core/config.ts +46 -1
  276. package/src/core/content-assets.ts +64 -144
  277. package/src/core/diagnostics.ts +36 -3
  278. package/src/core/directive-diagnostics.ts +265 -47
  279. package/src/core/former-routes.ts +46 -0
  280. package/src/core/git-ignored.ts +53 -0
  281. package/src/core/github.ts +5 -4
  282. package/src/core/heading-markers.ts +156 -2
  283. package/src/core/hidden-pages.ts +64 -0
  284. package/src/core/includes.ts +181 -41
  285. package/src/core/last-modified.ts +47 -10
  286. package/src/core/links.ts +438 -83
  287. package/src/core/load-module.ts +98 -9
  288. package/src/core/manifest.ts +12 -9
  289. package/src/core/markdown-mirrors.ts +52 -0
  290. package/src/core/mdx-elements.ts +153 -0
  291. package/src/core/mdx-syntax.ts +377 -0
  292. package/src/core/meta-diagnostics.ts +134 -0
  293. package/src/core/meta.ts +154 -55
  294. package/src/core/nav-diagnostics.ts +16 -4
  295. package/src/core/navigation.ts +70 -10
  296. package/src/core/ordering-prefix.ts +22 -2
  297. package/src/core/pinned-ids.ts +141 -0
  298. package/src/core/project-graph.ts +221 -29
  299. package/src/core/redirect-patterns.ts +41 -0
  300. package/src/core/relative-files.ts +145 -0
  301. package/src/core/schema.ts +17 -3
  302. package/src/core/sources/mdx-remote.ts +75 -14
  303. package/src/core/sources/normalize.ts +885 -179
  304. package/src/core/sources/notion.ts +5 -4
  305. package/src/core/sources/obsidian.ts +2 -5
  306. package/src/core/sources/types.ts +17 -0
  307. package/src/core/static-files.ts +40 -0
  308. package/src/core/static-host.ts +125 -0
  309. package/src/core/svg-images.ts +98 -0
  310. package/src/core/syntax-diagnostics.ts +491 -0
  311. package/src/core/types.ts +43 -1
  312. package/src/deploy/artifacts.ts +2 -28
  313. package/src/deploy/generated-files.ts +128 -0
  314. package/src/deploy/platforms/vercel.ts +25 -1
  315. package/src/deploy/redirects.ts +43 -16
  316. package/src/deploy/sitemap.ts +2 -1
  317. package/src/markdown/base-links.ts +87 -6
  318. package/src/markdown/code-title.ts +29 -13
  319. package/src/markdown/content-assets.ts +210 -0
  320. package/src/markdown/directives.ts +69 -5
  321. package/src/markdown/fence-language.ts +106 -0
  322. package/src/markdown/fence-meta.ts +42 -0
  323. package/src/markdown/github-alerts.ts +172 -0
  324. package/src/markdown/heading-anchors.ts +265 -56
  325. package/src/markdown/include.ts +30 -3
  326. package/src/markdown/index.ts +145 -40
  327. package/src/markdown/prompt-text.ts +95 -0
  328. package/src/markdown/relative-links.ts +37 -2
  329. package/src/markdown/route-snapshot.ts +22 -12
  330. package/src/markdown/svg-fallback.ts +51 -0
  331. package/src/markdown/title-heading.ts +134 -0
  332. package/src/migrate/migrate.ts +127 -2
  333. package/src/og/card.ts +14 -4
  334. package/src/openapi/asyncapi.ts +14 -6
  335. package/src/openapi/checks.ts +160 -15
  336. package/src/openapi/model.ts +172 -33
  337. package/src/openapi/parse.ts +13 -4
  338. package/src/openapi/render-mdx.ts +55 -9
  339. package/src/openapi/source.ts +87 -6
  340. package/src/registry/eject.ts +0 -1
  341. package/src/search/documents.ts +10 -2
  342. package/src/sources/filesystem.ts +28 -3
  343. package/src/sources/mdx-remote.ts +7 -15
  344. package/src/theme/color.ts +14 -0
  345. package/src/theme/entry.ts +22 -1
  346. package/src/theme/palette.ts +74 -1
  347. package/dist/cli/chunk-0pmb4tr4.js.map +0 -35
  348. package/dist/cli/chunk-0w6hs479.js.map +0 -10
  349. package/dist/cli/chunk-150jk7km.js +0 -52
  350. package/dist/cli/chunk-150jk7km.js.map +0 -10
  351. package/dist/cli/chunk-36bxs9c7.js.map +0 -10
  352. package/dist/cli/chunk-53jqw8z0.js +0 -89
  353. package/dist/cli/chunk-53jqw8z0.js.map +0 -10
  354. package/dist/cli/chunk-60hz265r.js.map +0 -10
  355. package/dist/cli/chunk-desvm72z.js.map +0 -14
  356. package/dist/cli/chunk-dpy8qdjf.js.map +0 -17
  357. package/dist/cli/chunk-es8h0v3j.js +0 -441
  358. package/dist/cli/chunk-es8h0v3j.js.map +0 -11
  359. package/dist/cli/chunk-kdpzw38a.js.map +0 -11
  360. package/dist/cli/chunk-nbyvgnnm.js.map +0 -36
  361. package/dist/cli/chunk-s0bdnc7v.js.map +0 -10
  362. package/dist/cli/chunk-twy7psdz.js.map +0 -10
  363. package/dist/cli/chunk-ydp3065p.js +0 -64
  364. package/dist/cli/chunk-ydp3065p.js.map +0 -10
  365. /package/dist/cli/{chunk-74wfhv79.js.map → chunk-05f21r8h.js.map} +0 -0
  366. /package/dist/cli/{chunk-9qzgg6mj.js.map → chunk-1cm0h819.js.map} +0 -0
  367. /package/dist/cli/{chunk-ms9z66nz.js.map → chunk-4rftmttv.js.map} +0 -0
  368. /package/dist/cli/{chunk-hvcxng5f.js.map → chunk-7tekknev.js.map} +0 -0
  369. /package/dist/cli/{chunk-bxwhtvw8.js.map → chunk-ahc5gc9h.js.map} +0 -0
  370. /package/dist/cli/{chunk-tfycddbt.js.map → chunk-bjk964fp.js.map} +0 -0
  371. /package/dist/cli/{chunk-dqhg54mr.js.map → chunk-dmx6cezx.js.map} +0 -0
  372. /package/dist/cli/{chunk-ave1wcbr.js.map → chunk-m9bp2hc1.js.map} +0 -0
  373. /package/dist/cli/{chunk-58bt3hag.js.map → chunk-mrvh4c88.js.map} +0 -0
  374. /package/dist/cli/{chunk-1f882900.js.map → chunk-th0pgaj5.js.map} +0 -0
  375. /package/dist/cli/{chunk-dhwtqnnd.js.map → chunk-vnbvhgmd.js.map} +0 -0
  376. /package/dist/cli/{chunk-j1x92mx9.js.map → chunk-w6e455pz.js.map} +0 -0
  377. /package/dist/cli/{chunk-y4msrwm9.js.map → chunk-xgq4eytj.js.map} +0 -0
@@ -0,0 +1,11 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/core/static-host.ts", "../src/cli/eject-scripts.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * What a static host does with the URLs `blume dev` and `blume preview`\n * would otherwise answer on their own terms. Astro's `trailingSlash: \"never\"`\n * has both 404 a slashed URL (`/guide/`), which every host answers: Vercel\n * redirects it to `/guide`, and the others serve `guide/index.html`. And a\n * folder of HTML shipped in `public/` (`public/demo/index.html`) is served at\n * `/demo/`, `/demo` redirecting there, so the relative links inside it\n * resolve against the folder; the dev server 404s both spellings, and Vite's\n * preview serves only the slashless one.\n */\n\nimport { statSync } from \"node:fs\";\nimport type { IncomingMessage, Server, ServerResponse } from \"node:http\";\n\nimport { join, resolve } from \"pathe\";\n\nimport { stripBasePath } from \"./base-path.ts\";\nimport { trimEnd } from \"./trim.ts\";\n\n/** How to answer a request ahead of the server's own handlers. */\nexport type HostAnswer =\n | { kind: \"redirect\"; location: string; status: number }\n | { kind: \"rewrite\"; url: string };\n\n/**\n * The paths Astro keeps out of its trailing-slash handling (`/_astro/`,\n * `/@vite/`, `/.well-known/`, `//`), and the root.\n */\nconst UNHANDLED_PATH = /^\\/(?:[_@./]|$)/u;\n\n/** A request URL's path and its query string, `?` included. */\nconst splitUrl = (url: string): { pathname: string; search: string } => {\n const queryAt = url.search(/[?#]/u);\n return queryAt === -1\n ? { pathname: url, search: \"\" }\n : { pathname: url.slice(0, queryAt), search: url.slice(queryAt) };\n};\n\n/**\n * Whether `public/<path>/index.html` exists: a folder of HTML the site ships\n * as is. `path` is the decoded request path with `deployment.base` stripped.\n */\nexport const publicFolder = (publicDir: string) => {\n const root = resolve(publicDir);\n return (path: string): boolean => {\n const index = join(root, path, \"index.html\");\n if (!index.startsWith(`${root}/`)) {\n return false;\n }\n try {\n return statSync(index).isFile();\n } catch {\n return false;\n }\n };\n};\n\n/**\n * How a static host answers a URL's trailing slash, or null to leave the\n * request alone. A slashed URL redirects to its slashless page, its query\n * kept, unless it names a public folder, which serves its `index.html`; a\n * slashless public folder redirects to its slashed URL. `base` is the\n * normalized `deployment.base`, which the URL carries and `public/` doesn't.\n * The redirect is a `301`, a `308` for a method a `301` would turn into a\n * `GET`, as Astro answers on a server-rendered route.\n */\nexport const trailingSlashAnswer = (\n request: Pick<IncomingMessage, \"method\" | \"url\">,\n base: string,\n isPublicFolder: (path: string) => boolean\n): HostAnswer | null => {\n const { pathname, search } = splitUrl(request.url ?? \"/\");\n if (UNHANDLED_PATH.test(pathname)) {\n return null;\n }\n let path: string;\n try {\n path = decodeURIComponent(stripBasePath(base, pathname));\n } catch {\n return null;\n }\n const status =\n request.method === \"GET\" || request.method === \"HEAD\" ? 301 : 308;\n if (!pathname.endsWith(\"/\")) {\n return isPublicFolder(path)\n ? { kind: \"redirect\", location: `${pathname}/${search}`, status }\n : null;\n }\n const slashless = trimEnd(pathname, \"/\");\n return isPublicFolder(trimEnd(path, \"/\"))\n ? { kind: \"rewrite\", url: `${slashless}/index.html${search}` }\n : { kind: \"redirect\", location: `${slashless}${search}`, status };\n};\n\n/**\n * Answer every request on `server` with `answer` first: a redirect is sent\n * then and there, and a rewrite changes the URL the server's own handlers\n * (Vite's middleware) then see. They're the request listeners the server\n * already has, so this goes ahead of every middleware, Astro's included.\n */\nexport const answerRequestsFirst = (\n server: Server,\n answer: (request: IncomingMessage) => HostAnswer | null,\n headers: Record<string, string> = {}\n): void => {\n const handlers = server.listeners(\"request\");\n server.removeAllListeners(\"request\");\n server.on(\"request\", (request: IncomingMessage, response: ServerResponse) => {\n const answered = answer(request);\n if (answered?.kind === \"redirect\") {\n response.writeHead(answered.status, {\n ...headers,\n Location: answered.location,\n });\n response.end();\n return;\n }\n if (answered) {\n request.url = answered.url;\n }\n for (const handler of handlers) {\n handler.call(server, request, response);\n }\n });\n};\n",
6
+ "import { existsSync, readFileSync } from \"node:fs\";\nimport { readFile, writeFile } from \"node:fs/promises\";\n\nimport { join } from \"pathe\";\n\nimport { EJECTED_CONFIG_HEADER } from \"../astro/templates.ts\";\nimport { packageRoot } from \"../core/package-root.ts\";\nimport { commandsFor, detectProjectPackageManager } from \"./init/scaffold.ts\";\nimport type { PackageManager } from \"./init/scaffold.ts\";\nimport { logger } from \"./log.ts\";\n\n/** A JSON value, as `JSON.parse` of a manifest can return. */\ntype JsonValue =\n | string\n | number\n | boolean\n | null\n | JsonValue[]\n | { [key: string]: JsonValue };\n\n/** The slice of package.json the rewrite touches; the rest rides along. */\ninterface PackageManifest {\n [key: string]: JsonValue | undefined;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n optionalDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n scripts?: Record<string, string>;\n}\n\n/** Package name → the semver range to depend on it at. */\nexport interface DependencyRanges {\n [name: string]: string;\n}\n\n/**\n * The version range Blume itself uses for each package it depends on or\n * accepts as a peer, plus `blume` at the installed version — what an ejected\n * app should pin so it keeps building against the same majors.\n */\nexport const blumeDependencyRanges = (): DependencyRanges => {\n // SAFETY: blume's own package.json, which declares its version and both\n // dependency maps; nothing else is read.\n const manifest = JSON.parse(\n readFileSync(join(packageRoot(), \"package.json\"), \"utf-8\")\n ) as {\n dependencies: Record<string, string>;\n peerDependencies: Record<string, string>;\n version: string;\n };\n return {\n ...manifest.peerDependencies,\n ...manifest.dependencies,\n blume: `^${manifest.version}`,\n };\n};\n\n/** Whether the manifest already lists `name` in any dependency field. */\nconst declares = (pkg: PackageManifest, name: string): boolean =>\n [\n pkg.dependencies,\n pkg.devDependencies,\n pkg.optionalDependencies,\n pkg.peerDependencies,\n ].some((field) => field !== undefined && Object.hasOwn(field, name));\n\n/**\n * Point the project's package.json at the ejected app. Its scripts run Astro\n * directly: after an eject the Blume CLI no longer manages the runtime, so\n * scaffolded scripts like `\"dev\": \"blume dev\"` would rebuild the removed\n * `.blume` tree instead of serving the ejected app. And every package the\n * ejected app imports by bare name (`dependencies`, from `eject()`) that the\n * project doesn't list yet becomes a dependency at the range Blume itself\n * uses (`ranges`).\n *\n * Returns the names it added, so the caller can ask for an install. A missing\n * or unreadable package.json is left alone.\n */\nexport const updatePackageScripts = async (\n root: string,\n dependencies: string[] = [],\n ranges: DependencyRanges = blumeDependencyRanges()\n): Promise<string[]> => {\n const pkgPath = join(root, \"package.json\");\n let pkg: PackageManifest;\n try {\n pkg = JSON.parse(await readFile(pkgPath, \"utf-8\"));\n } catch {\n return [];\n }\n const scripts = pkg.scripts ?? {};\n pkg.scripts = {\n ...scripts,\n build: \"astro build\",\n dev: \"astro dev\",\n preview: \"astro preview\",\n };\n const added = dependencies.filter((name) => !declares(pkg, name));\n if (added.length > 0) {\n // Sorted, the way package managers write the field.\n pkg.dependencies = Object.fromEntries(\n Object.entries({\n ...pkg.dependencies,\n ...Object.fromEntries(added.map((name) => [name, ranges[name] ?? \"*\"])),\n }).toSorted(([a], [b]) => (a < b ? -1 : 1))\n );\n }\n await writeFile(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`, \"utf-8\");\n return added;\n};\n\n/**\n * The first line Blume 1's `blume eject` wrote into the ejected\n * `astro.config.mjs` — the hidden runtime's own header, carried over. Blume 2's\n * hidden runtime keeps it under `.blume/`, never at the project root, so a root\n * config that opens with it is an app Blume 1 ejected.\n */\nconst BLUME_1_EJECTED_CONFIG_HEADER =\n \"// Generated by Blume. Do not edit; this file is recreated on each run.\";\n\n/**\n * Whether `root` holds an app `blume eject` already wrote: a root\n * `astro.config.mjs` whose first line is eject's header, or the header Blume 1\n * ejected with. The header is the only signal: a Blume project may keep its own\n * `astro.config.mjs` and a codegen `src/generated/` folder beside its content,\n * and neither makes it an ejected app.\n */\nexport const isEjectedProject = (root: string): boolean => {\n const config = join(root, \"astro.config.mjs\");\n if (!existsSync(config)) {\n return false;\n }\n const source = readFileSync(config, \"utf-8\");\n return (\n source.startsWith(EJECTED_CONFIG_HEADER) ||\n source.startsWith(BLUME_1_EJECTED_CONFIG_HEADER)\n );\n};\n\n/** The Blume commands that run the hidden `.blume/` copy of the site. */\nexport type RuntimeCommand = \"build\" | \"check\" | \"dev\" | \"preview\" | \"sync\";\n\n/**\n * What an ejected app runs in place of each {@link RuntimeCommand}: its own\n * `dev`/`build`/`preview` scripts (eject writes them), or Astro's CLI for the\n * check and the content sync.\n */\nconst ejectedEquivalent = (\n pm: PackageManager,\n command: RuntimeCommand\n): string => {\n const { build, dev, exec } = commandsFor(pm);\n return {\n build,\n check: `${exec} astro check`,\n dev,\n // Spelled like `dev`: npm runs a custom script only through `run`.\n preview: pm === \"npm\" ? \"npm run preview\" : `${pm} preview`,\n sync: `${exec} astro sync`,\n }[command];\n};\n\n/**\n * Stop a command that works on the hidden runtime in an ejected app. `dev`,\n * `build`, `check`, and `sync` would regenerate `.blume/` from\n * `blume.config.ts` and run that hidden copy, ignoring every edit made to the\n * app since eject, and `preview` would look for that copy's build; point at\n * the app's own command under the project's package manager instead.\n */\nexport const refuseIfEjected = async (\n root: string,\n command: RuntimeCommand\n): Promise<void> => {\n if (!isEjectedProject(root)) {\n return;\n }\n const pm = await detectProjectPackageManager(root);\n logger.error(\n `This project was ejected to a standalone Astro app, so \\`blume ${command}\\` would run a regenerated copy of the site instead of it. Run \\`${ejectedEquivalent(pm, command)}\\` instead.`\n );\n process.exit(1);\n};\n"
7
+ ],
8
+ "mappings": "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",
9
+ "debugId": "CFEE49169891DC2F64756E2164756E21",
10
+ "names": []
11
+ }
@@ -3,7 +3,7 @@ import {
3
3
  resolveRuntimeDir,
4
4
  resolveProjectContext,
5
5
  loadConfig
6
- } from "./chunk-124fvmzq.js";
6
+ } from "./chunk-dm4mg9bj.js";
7
7
  import"./chunk-zccbjcj0.js";
8
8
  import {
9
9
  commandMeta,
@@ -11,24 +11,24 @@ import {
11
11
  } from "./index.js";
12
12
  import {
13
13
  readDevLock
14
- } from "./chunk-tfycddbt.js";
15
- import"./chunk-dpy8qdjf.js";
14
+ } from "./chunk-bjk964fp.js";
15
+ import"./chunk-as09pafp.js";
16
16
  import {
17
17
  refuseIfEjected
18
- } from "./chunk-53jqw8z0.js";
19
- import"./chunk-nbyvgnnm.js";
20
- import"./chunk-desvm72z.js";
21
- import"./chunk-0pmb4tr4.js";
22
- import"./chunk-ckrcm08h.js";
23
- import"./chunk-j1x92mx9.js";
18
+ } from "./chunk-wehv26ry.js";
19
+ import"./chunk-1rkxzg3n.js";
20
+ import"./chunk-8f8xw4x2.js";
21
+ import"./chunk-2nr29y95.js";
22
+ import"./chunk-a3ydrqny.js";
23
+ import"./chunk-w6e455pz.js";
24
24
  import"./chunk-jq5n4avg.js";
25
- import"./chunk-es8h0v3j.js";
26
- import"./chunk-dqhg54mr.js";
25
+ import"./chunk-96snx8yy.js";
26
+ import"./chunk-dmx6cezx.js";
27
27
  import {
28
28
  prepareProject
29
- } from "./chunk-297ajdcv.js";
30
- import"./chunk-ms9z66nz.js";
31
- import"./chunk-s0bdnc7v.js";
29
+ } from "./chunk-c69tw29j.js";
30
+ import"./chunk-4rftmttv.js";
31
+ import"./chunk-79bzzkx4.js";
32
32
 
33
33
  // src/cli/commands/sync.ts
34
34
  import { rm } from "node:fs/promises";
@@ -74,4 +74,4 @@ export {
74
74
  };
75
75
 
76
76
  //# debugId=67B7B6A961A6206764756E2164756E21
77
- //# sourceMappingURL=chunk-y4msrwm9.js.map
77
+ //# sourceMappingURL=chunk-xgq4eytj.js.map
@@ -7,50 +7,51 @@ import {
7
7
  } from "./index.js";
8
8
  import {
9
9
  deployPlatform
10
- } from "./chunk-124fvmzq.js";
10
+ } from "./chunk-dm4mg9bj.js";
11
+ import"./chunk-8f8xw4x2.js";
11
12
  import"./chunk-zccbjcj0.js";
12
- import"./chunk-0pmb4tr4.js";
13
+ import {
14
+ refuseIfEjected
15
+ } from "./chunk-wehv26ry.js";
13
16
  import {
14
17
  publishBuildProject,
15
18
  ogCacheDir,
16
19
  pruneCardCache,
17
20
  cardCacheTally
18
- } from "./chunk-nbyvgnnm.js";
19
- import"./chunk-desvm72z.js";
21
+ } from "./chunk-1rkxzg3n.js";
22
+ import"./chunk-2nr29y95.js";
20
23
  import {
21
24
  deployOutputDir,
22
25
  deployStaticDir,
23
26
  surfaceAdapterOutput
24
- } from "./chunk-dpy8qdjf.js";
27
+ } from "./chunk-as09pafp.js";
28
+ import"./chunk-96snx8yy.js";
25
29
  import {
26
30
  ensureGitignore
27
31
  } from "./chunk-yzhm0j9q.js";
28
- import"./chunk-j1x92mx9.js";
32
+ import"./chunk-w6e455pz.js";
29
33
  import {
30
34
  removedBuildFlags,
31
35
  flagList,
32
36
  removedBuildFlagsAdvice
33
- } from "./chunk-9qzgg6mj.js";
37
+ } from "./chunk-1cm0h819.js";
34
38
  import {
35
- astroBuildDiagnostics
36
- } from "./chunk-150jk7km.js";
39
+ astroBuildDiagnostics,
40
+ buildFailureLocator
41
+ } from "./chunk-kkrteb15.js";
37
42
  import {
38
43
  refuseIfDevRunning
39
- } from "./chunk-tfycddbt.js";
40
- import {
41
- refuseIfEjected
42
- } from "./chunk-53jqw8z0.js";
43
- import"./chunk-ckrcm08h.js";
44
+ } from "./chunk-bjk964fp.js";
45
+ import"./chunk-a3ydrqny.js";
44
46
  import"./chunk-jq5n4avg.js";
45
- import"./chunk-es8h0v3j.js";
46
- import"./chunk-dqhg54mr.js";
47
+ import"./chunk-dmx6cezx.js";
47
48
  import {
48
49
  prepareProject
49
- } from "./chunk-297ajdcv.js";
50
+ } from "./chunk-c69tw29j.js";
50
51
  import {
51
52
  serverFeatures
52
- } from "./chunk-ms9z66nz.js";
53
- import"./chunk-s0bdnc7v.js";
53
+ } from "./chunk-4rftmttv.js";
54
+ import"./chunk-79bzzkx4.js";
54
55
 
55
56
  // src/cli/commands/build.ts
56
57
  import { existsSync } from "node:fs";
@@ -169,7 +170,7 @@ var reportBuild = async (project, distDir, args) => {
169
170
  `));
170
171
  await runClientAssetChecks(distDir, args);
171
172
  if (project.droppedPages > 0) {
172
- logger.warn(`${project.droppedPages} page(s) failed frontmatter validation and are missing from this build.`);
173
+ logger.warn(`${project.droppedPages} page(s) failed validation and are missing from this build.`);
173
174
  }
174
175
  logger.success(`Built to ${distDir}`);
175
176
  };
@@ -236,7 +237,10 @@ var buildCommand = defineCommand({
236
237
  if (error instanceof BlumeError || !(error instanceof Error)) {
237
238
  throw error;
238
239
  }
239
- reportDiagnostics(astroBuildDiagnostics(error), root);
240
+ reportDiagnostics(await astroBuildDiagnostics(error, {
241
+ locate: buildFailureLocator(project),
242
+ root
243
+ }), root);
240
244
  process.exit(1);
241
245
  }
242
246
  await reportCardCache(project, !runtimeDir);
@@ -271,5 +275,5 @@ export {
271
275
  runClientAssetChecks
272
276
  };
273
277
 
274
- //# debugId=5EAF9E033A01BFBE64756E2164756E21
275
- //# sourceMappingURL=chunk-36bxs9c7.js.map
278
+ //# debugId=43360653920765D464756E2164756E21
279
+ //# sourceMappingURL=chunk-xt0qvz1t.js.map
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/cli/commands/build.ts"],
4
+ "sourcesContent": [
5
+ "import { existsSync } from \"node:fs\";\nimport { readdir, stat } from \"node:fs/promises\";\n\nimport { build } from \"astro\";\nimport { defineCommand } from \"citty\";\nimport { join } from \"pathe\";\n\nimport { publishBuildProject } from \"../../astro/integration.ts\";\nimport { BlumeError } from \"../../core/diagnostics.ts\";\nimport { ensureGitignore } from \"../../core/gitignore.ts\";\nimport type { BlumeProject } from \"../../core/project-graph.ts\";\nimport { serverFeatures } from \"../../core/server-features.ts\";\nimport {\n deployOutputDir,\n deployStaticDir,\n surfaceAdapterOutput,\n} from \"../../deploy/adapter-output.ts\";\nimport { deployPlatform } from \"../../deploy/platforms/index.ts\";\nimport { cardCacheTally, ogCacheDir, pruneCardCache } from \"../../og/cache.ts\";\nimport {\n flagList,\n removedBuildFlags,\n removedBuildFlagsAdvice,\n} from \"../../upgrade/upgrade.ts\";\nimport {\n astroBuildDiagnostics,\n buildFailureLocator,\n} from \"../build-failure.ts\";\nimport { commandMeta } from \"../command-meta.ts\";\nimport { refuseIfDevRunning } from \"../dev-lock.ts\";\nimport { refuseIfEjected } from \"../eject-scripts.ts\";\nimport { logger, reportDiagnostics } from \"../log.ts\";\nimport { prepareProject } from \"../prepare.ts\";\n\nconst BUDGET_JS = \"budget-js\";\nconst BUDGET_CSS = \"budget-css\";\n\ninterface BudgetArgs {\n \"budget-css\"?: string;\n \"budget-js\"?: string;\n}\n\n/**\n * Reject a non-numeric performance budget. `Number(\"250kb\")` is `NaN` and\n * `total > NaN` is always false, so a typo'd flag would silently pass the gate;\n * fail up front instead.\n */\nconst validateBudgetFlags = (args: BudgetArgs): void => {\n for (const flag of [BUDGET_JS, BUDGET_CSS] as const) {\n const value = args[flag];\n const parsed = Number(value);\n // Equivalent to `!(parsed > 0)` but without the inverted check: this must\n // also reject `NaN` (a typo'd flag like \"250kb\"), which `parsed <= 0` alone\n // would let through since `NaN <= 0` is false.\n if (value !== undefined && (Number.isNaN(parsed) || parsed <= 0)) {\n logger.error(\n `Invalid --${flag} \"${value}\" (expected a positive number of kB).`\n );\n process.exit(1);\n }\n }\n};\n\n/**\n * Report how many OG cards the build read back from the on-disk cache against\n * how many it rendered (the endpoint tallies both), so a warm rebuild shows\n * where the time went. With `prune`, also drop the cached cards this build\n * never asked for — renamed pages, edited descriptions, cards from an earlier\n * Blume version — so a persisted cache holds exactly the current site's cards.\n */\nconst reportCardCache = async (\n project: BlumeProject,\n prune: boolean\n): Promise<void> => {\n const cards = cardCacheTally();\n if (!cards) {\n return;\n }\n logger.info(\n `OG cards: ${cards.hits} reused from the cache, ${cards.misses} rendered`\n );\n if (prune) {\n await pruneCardCache(ogCacheDir(project.context));\n }\n};\n\nconst formatBytes = (bytes: number): string => {\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n const digits = bytes < 1024 * 100 ? 1 : 0;\n return `${(bytes / 1024).toFixed(digits)} kB`;\n};\n\n/** Sizes of `dist/_astro/*.<ext>`, largest first (empty when none exist). */\nconst astroAssets = async (\n distDir: string,\n ext: string\n): Promise<{ name: string; size: number }[]> => {\n const astroDir = join(distDir, \"_astro\");\n if (!existsSync(astroDir)) {\n return [];\n }\n const entries = await readdir(astroDir);\n const files = entries.filter((name) => name.endsWith(`.${ext}`));\n const sized = await Promise.all(\n files.map(async (name) => {\n const info = await stat(join(astroDir, name));\n return { name, size: info.size };\n })\n );\n return sized.toSorted((a, b) => b.size - a.size);\n};\n\nconst totalSize = (assets: { size: number }[]): number =>\n assets.reduce((sum, asset) => sum + asset.size, 0);\n\n/**\n * Print the client JavaScript Astro shipped, largest first, plus the total. A\n * dependency-free bundle report — the interactive weight of a docs site is its\n * `_astro/*.js`, so this surfaces regressions without a visualizer.\n */\nconst reportBundleSizes = async (distDir: string): Promise<void> => {\n const sized = await astroAssets(distDir, \"js\");\n if (sized.length === 0) {\n logger.info(\"No client JavaScript emitted — the site ships zero JS.\");\n return;\n }\n const rows = sized\n .slice(0, 15)\n .map((file) => ` ${formatBytes(file.size).padStart(8)} ${file.name}`);\n logger.box(\n [\n `Client JavaScript — ${sized.length} file(s), ${formatBytes(totalSize(sized))} total`,\n \"\",\n ...rows,\n sized.length > 15 ? ` … and ${sized.length - 15} more` : null,\n ]\n .filter((line) => line !== null)\n .join(\"\\n\")\n );\n};\n\n/**\n * Enforce a performance budget on the built client assets: fail the build when\n * total `_astro/*.js` (or `*.css`) exceeds the given kB cap. Budgets that would\n * otherwise be \"documented, not measured\" become a real CI gate. Returns whether\n * every budget passed.\n */\nconst enforceBudget = async (\n distDir: string,\n args: BudgetArgs\n): Promise<\"fail\" | \"pass\" | \"skip\"> => {\n const checks: { ext: string; limitKb: number; name: string }[] = [\n ...(args[BUDGET_JS]\n ? [{ ext: \"js\", limitKb: Number(args[BUDGET_JS]), name: \"JavaScript\" }]\n : []),\n ...(args[BUDGET_CSS]\n ? [{ ext: \"css\", limitKb: Number(args[BUDGET_CSS]), name: \"CSS\" }]\n : []),\n ];\n if (checks.length === 0) {\n return \"skip\";\n }\n let passed = true;\n for (const check of checks) {\n // oxlint-disable-next-line no-await-in-loop -- a couple of sequential reads\n const total = totalSize(await astroAssets(distDir, check.ext));\n const limit = check.limitKb * 1024;\n if (total > limit) {\n passed = false;\n logger.error(\n `${check.name} budget exceeded: ${formatBytes(total)} > ${check.limitKb} kB`\n );\n } else {\n logger.success(\n `${check.name} budget: ${formatBytes(total)} / ${check.limitKb} kB`\n );\n }\n }\n return passed ? \"pass\" : \"fail\";\n};\n\n/**\n * Run the optional bundle report (`--analyze`) and performance-budget gate\n * against the directory whose `_astro/` client assets the deploy serves.\n * Shared by real and isolated builds — an isolated CI run passing\n * `--budget-js` must still fail on an exceeded budget rather than silently\n * skipping the check. Exits non-zero when a budget is exceeded.\n */\nexport const runClientAssetChecks = async (\n staticDir: string,\n args: { analyze?: boolean } & BudgetArgs\n): Promise<void> => {\n if (args.analyze) {\n await reportBundleSizes(staticDir);\n }\n if ((await enforceBudget(staticDir, args)) === \"fail\") {\n process.exit(1);\n }\n};\n\n/**\n * Print the build summary box and run the optional bundle report / budget\n * gate against the served static dir. The deploy artifacts themselves\n * (search index, llms.txt, sitemap, robots, redirect and header files, …)\n * were written by the integration's `astro:build:done` hook during\n * `build()` — see `deploy/artifacts.ts`. Exits non-zero if a budget is\n * exceeded.\n */\nconst reportBuild = async (\n project: BlumeProject,\n distDir: string,\n args: { analyze?: boolean } & BudgetArgs\n): Promise<void> => {\n const { config } = project;\n const features = serverFeatures(config);\n // The sitemap needs both the flag and a `site` (absolute URLs) — only the\n // latter deserves the remediation hint.\n const sitemapNote = config.seo.sitemap\n ? \"no (set deployment.site)\"\n : \"no (seo.sitemap is false)\";\n const rows: [label: string, value: string | number][] = [\n [\"Output\", config.deployment.options.output],\n [\"Adapter\", config.deployment.kind],\n [\"Site\", config.deployment.options.site ?? \"not set\"],\n [\"Search\", config.search.provider.kind],\n [\"Redirects\", config.redirects.length],\n [\n \"Sitemap\",\n config.deployment.options.site && config.seo.sitemap\n ? \"yes\"\n : sitemapNote,\n ],\n [\"Robots\", config.seo.robots ? \"yes\" : \"no\"],\n [\"Agent JSON\", config.agents.agentReadability ? \"yes\" : \"no\"],\n [\"LLM files\", config.agents.llmsTxt.enabled ? \"yes\" : \"no\"],\n [\"Server features\", features.length > 0 ? features.join(\", \") : \"none\"],\n ];\n // One label column for every row, sized by the longest label.\n const labelWidth = Math.max(...rows.map(([label]) => label.length)) + 2;\n logger.box(\n rows\n .map(([label, value]) => `${label.padEnd(labelWidth)}${value}`)\n .join(\"\\n\")\n );\n\n await runClientAssetChecks(distDir, args);\n\n // Only reachable with --no-strict (strict aborts earlier): repeat the missing\n // count next to the success banner so it can't scroll away unseen.\n if (project.droppedPages > 0) {\n logger.warn(\n `${project.droppedPages} page(s) failed validation and are missing from this build.`\n );\n }\n logger.success(`Built to ${distDir}`);\n};\n\nexport const buildCommand = defineCommand({\n args: {\n analyze: {\n description: \"Report client JavaScript bundle sizes after the build.\",\n type: \"boolean\",\n },\n [BUDGET_CSS]: {\n description: \"Fail if total client CSS exceeds this many kB.\",\n type: \"string\",\n },\n [BUDGET_JS]: {\n description: \"Fail if total client JavaScript exceeds this many kB.\",\n type: \"string\",\n },\n isolated: {\n description:\n \"Build into an isolated .blume-verify runtime (and its own dist) so a running dev server and the real dist/ are untouched. For verifying changes while `blume dev` runs.\",\n type: \"boolean\",\n },\n preview: {\n description: \"Include drafts and unpublished CMS content.\",\n type: \"boolean\",\n },\n strict: {\n default: true,\n description:\n \"Fail on error diagnostics (default; pass --no-strict to build anyway, dropping pages that fail validation).\",\n type: \"boolean\",\n },\n },\n meta: commandMeta.build,\n async run({ args, rawArgs }) {\n const root = process.cwd();\n\n // citty accepts unknown flags, so a Blume 1 `--adapter vercel --output\n // server` would otherwise build a static site without a word.\n const removed = removedBuildFlags(rawArgs);\n if (removed.length > 0) {\n logger.error(\n `blume build no longer takes ${flagList(removed)}. ${removedBuildFlagsAdvice(removed)}`\n );\n process.exit(1);\n }\n await refuseIfEjected(root, \"build\");\n\n // `--isolated` (or BLUME_RUNTIME_DIR) relocates the whole runtime to a\n // sibling dir so this build never touches a live dev server's `.blume/` or\n // the user's real `dist/`. A non-default runtime dir has no dev lock, so the\n // refusal below lets it proceed; a plain build still refuses.\n const runtimeDir = args.isolated\n ? \".blume-verify\"\n : process.env.BLUME_RUNTIME_DIR;\n refuseIfDevRunning(root, \"building\", { isolatedHint: true, runtimeDir });\n if (args.isolated) {\n await ensureGitignore(root, [\".blume-verify/\"]);\n }\n\n validateBudgetFlags(args);\n\n const project = await prepareProject({\n mode: \"build\",\n preview: args.preview,\n root,\n runtimeDir,\n strict: args.strict,\n });\n\n logger.start(\n `Building ${project.graph.pages.length} page(s) (${project.config.deployment.options.output} output)`\n );\n\n // Hand the scanned project to the integration: its `astro:build:done`\n // hook writes the deploy artifacts (search index, llms.txt, sitemap, …)\n // into Astro's client output during the build. An isolated build is a\n // throwaway verify that only needs to confirm the site compiles and\n // renders, so it publishes nothing — no network post-steps (a hosted\n // search sync would push), no deploy artifacts.\n if (!runtimeDir) {\n publishBuildProject(project);\n }\n\n try {\n await build({\n logLevel: \"info\",\n root: project.context.outDir,\n });\n } catch (error) {\n // Astro rejects when the site fails to compile or render (MDX that\n // doesn't parse, a component that throws): report that as a build error\n // at the file it names, not as an internal error blaming Blume. A\n // BlumeError keeps its own diagnostic.\n if (error instanceof BlumeError || !(error instanceof Error)) {\n throw error;\n }\n reportDiagnostics(\n await astroBuildDiagnostics(error, {\n locate: buildFailureLocator(project),\n root,\n }),\n root\n );\n process.exit(1);\n }\n\n // A real build also prunes the cache; an isolated verify must not evict\n // cards a live dev server is still serving.\n await reportCardCache(project, !runtimeDir);\n\n // Everything the deploy target does differently after `astro build` comes\n // off its platform (see `deploy/platforms/*`): a server build's post-build\n // step (Vercel's function-bundle audit and negotiation routes, Cloudflare's\n // wrapper Worker), and where its bundle and static assets landed.\n const { deployment } = project.config;\n const platform = deployPlatform(deployment);\n const server = deployment.options.output === \"server\";\n const finalize = async (isolated: boolean): Promise<void> => {\n if (\n server &&\n platform.finalizeBuild &&\n !(await platform.finalizeBuild({ isolated, log: logger, project }))\n ) {\n process.exit(1);\n }\n };\n\n // The bundle report and budget gate still run for an isolated build —\n // `blume build --isolated --budget-js 100` exiting 0 without measuring\n // anything would be a silent false pass in CI. An isolated build never\n // surfaces the adapter bundle to the project root, so its output dirs\n // resolve under the relocated runtime.\n if (runtimeDir) {\n await finalize(true);\n await runClientAssetChecks(\n deployStaticDir(project.config, project.context),\n args\n );\n logger.success(\n `Isolated build OK — output at ${deployOutputDir(project.config, project.context)} (not published).`\n );\n return;\n }\n\n // A server adapter's deploy bundle is a build artifact — keep it out of\n // version control (Vercel's own CLI ignores `.vercel/` for the same reason).\n // Ignoring it is independent of whether the bundle had to be moved below:\n // Vercel writes straight to the project root, Netlify does not.\n const { ignoreDir } = platform.hiddenRuntime;\n if (server && ignoreDir) {\n await ensureGitignore(root, [ignoreDir]);\n }\n\n // Netlify writes its deploy bundle relative to the Astro root — which Blume\n // points at the hidden `.blume` runtime — so the bundle lands where the\n // deploy platform never looks. Surface it up to the project root before\n // publishing artifacts into the served static dir.\n const surfaced = await surfaceAdapterOutput(\n project.config,\n project.context\n );\n if (surfaced.moved) {\n logger.success(`Surfaced ${deployment.kind} output to ${surfaced.to}`);\n }\n\n await finalize(false);\n\n await reportBuild(\n project,\n deployStaticDir(project.config, project.context),\n args\n );\n },\n});\n"
6
+ ],
7
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;AAEA;AACA;AACA;AA6BA,IAAM,YAAY;AAClB,IAAM,aAAa;AAYnB,IAAM,sBAAsB,CAAC,SAA2B;AAAA,EACtD,WAAW,QAAQ,CAAC,WAAW,UAAU,GAAY;AAAA,IACnD,MAAM,QAAQ,KAAK;AAAA,IACnB,MAAM,SAAS,OAAO,KAAK;AAAA,IAI3B,IAAI,UAAU,cAAc,OAAO,MAAM,MAAM,KAAK,UAAU,IAAI;AAAA,MAChE,OAAO,MACL,aAAa,SAAS,4CACxB;AAAA,MACA,QAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAAA;AAUF,IAAM,kBAAkB,OACtB,SACA,UACkB;AAAA,EAClB,MAAM,QAAQ,eAAe;AAAA,EAC7B,IAAI,CAAC,OAAO;AAAA,IACV;AAAA,EACF;AAAA,EACA,OAAO,KACL,aAAa,MAAM,+BAA+B,MAAM,iBAC1D;AAAA,EACA,IAAI,OAAO;AAAA,IACT,MAAM,eAAe,WAAW,QAAQ,OAAO,CAAC;AAAA,EAClD;AAAA;AAGF,IAAM,cAAc,CAAC,UAA0B;AAAA,EAC7C,IAAI,QAAQ,MAAM;AAAA,IAChB,OAAO,GAAG;AAAA,EACZ;AAAA,EACA,MAAM,SAAS,QAAQ,OAAO,MAAM,IAAI;AAAA,EACxC,OAAO,IAAI,QAAQ,MAAM,QAAQ,MAAM;AAAA;AAIzC,IAAM,cAAc,OAClB,SACA,QAC8C;AAAA,EAC9C,MAAM,WAAW,KAAK,SAAS,QAAQ;AAAA,EACvC,IAAI,CAAC,WAAW,QAAQ,GAAG;AAAA,IACzB,OAAO,CAAC;AAAA,EACV;AAAA,EACA,MAAM,UAAU,MAAM,QAAQ,QAAQ;AAAA,EACtC,MAAM,QAAQ,QAAQ,OAAO,CAAC,SAAS,KAAK,SAAS,IAAI,KAAK,CAAC;AAAA,EAC/D,MAAM,QAAQ,MAAM,QAAQ,IAC1B,MAAM,IAAI,OAAO,SAAS;AAAA,IACxB,MAAM,OAAO,MAAM,KAAK,KAAK,UAAU,IAAI,CAAC;AAAA,IAC5C,OAAO,EAAE,MAAM,MAAM,KAAK,KAAK;AAAA,GAChC,CACH;AAAA,EACA,OAAO,MAAM,SAAS,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI;AAAA;AAGjD,IAAM,YAAY,CAAC,WACjB,OAAO,OAAO,CAAC,KAAK,UAAU,MAAM,MAAM,MAAM,CAAC;AAOnD,IAAM,oBAAoB,OAAO,YAAmC;AAAA,EAClE,MAAM,QAAQ,MAAM,YAAY,SAAS,IAAI;AAAA,EAC7C,IAAI,MAAM,WAAW,GAAG;AAAA,IACtB,OAAO,KAAK,wDAAwD;AAAA,IACpE;AAAA,EACF;AAAA,EACA,MAAM,OAAO,MACV,MAAM,GAAG,EAAE,EACX,IAAI,CAAC,SAAS,KAAK,YAAY,KAAK,IAAI,EAAE,SAAS,CAAC,MAAM,KAAK,MAAM;AAAA,EACxE,OAAO,IACL;AAAA,IACE,uBAAuB,MAAM,mBAAmB,YAAY,UAAU,KAAK,CAAC;AAAA,IAC5E;AAAA,IACA,GAAG;AAAA,IACH,MAAM,SAAS,KAAK,WAAW,MAAM,SAAS,YAAY;AAAA,EAC5D,EACG,OAAO,CAAC,SAAS,SAAS,IAAI,EAC9B,KAAK;AAAA,CAAI,CACd;AAAA;AASF,IAAM,gBAAgB,OACpB,SACA,SACsC;AAAA,EACtC,MAAM,SAA2D;AAAA,IAC/D,GAAI,KAAK,aACL,CAAC,EAAE,KAAK,MAAM,SAAS,OAAO,KAAK,UAAU,GAAG,MAAM,aAAa,CAAC,IACpE,CAAC;AAAA,IACL,GAAI,KAAK,cACL,CAAC,EAAE,KAAK,OAAO,SAAS,OAAO,KAAK,WAAW,GAAG,MAAM,MAAM,CAAC,IAC/D,CAAC;AAAA,EACP;AAAA,EACA,IAAI,OAAO,WAAW,GAAG;AAAA,IACvB,OAAO;AAAA,EACT;AAAA,EACA,IAAI,SAAS;AAAA,EACb,WAAW,SAAS,QAAQ;AAAA,IAE1B,MAAM,QAAQ,UAAU,MAAM,YAAY,SAAS,MAAM,GAAG,CAAC;AAAA,IAC7D,MAAM,QAAQ,MAAM,UAAU;AAAA,IAC9B,IAAI,QAAQ,OAAO;AAAA,MACjB,SAAS;AAAA,MACT,OAAO,MACL,GAAG,MAAM,yBAAyB,YAAY,KAAK,OAAO,MAAM,YAClE;AAAA,IACF,EAAO;AAAA,MACL,OAAO,QACL,GAAG,MAAM,gBAAgB,YAAY,KAAK,OAAO,MAAM,YACzD;AAAA;AAAA,EAEJ;AAAA,EACA,OAAO,SAAS,SAAS;AAAA;AAUpB,IAAM,uBAAuB,OAClC,WACA,SACkB;AAAA,EAClB,IAAI,KAAK,SAAS;AAAA,IAChB,MAAM,kBAAkB,SAAS;AAAA,EACnC;AAAA,EACA,IAAK,MAAM,cAAc,WAAW,IAAI,MAAO,QAAQ;AAAA,IACrD,QAAQ,KAAK,CAAC;AAAA,EAChB;AAAA;AAWF,IAAM,cAAc,OAClB,SACA,SACA,SACkB;AAAA,EAClB,QAAQ,WAAW;AAAA,EACnB,MAAM,WAAW,eAAe,MAAM;AAAA,EAGtC,MAAM,cAAc,OAAO,IAAI,UAC3B,6BACA;AAAA,EACJ,MAAM,OAAkD;AAAA,IACtD,CAAC,UAAU,OAAO,WAAW,QAAQ,MAAM;AAAA,IAC3C,CAAC,WAAW,OAAO,WAAW,IAAI;AAAA,IAClC,CAAC,QAAQ,OAAO,WAAW,QAAQ,QAAQ,SAAS;AAAA,IACpD,CAAC,UAAU,OAAO,OAAO,SAAS,IAAI;AAAA,IACtC,CAAC,aAAa,OAAO,UAAU,MAAM;AAAA,IACrC;AAAA,MACE;AAAA,MACA,OAAO,WAAW,QAAQ,QAAQ,OAAO,IAAI,UACzC,QACA;AAAA,IACN;AAAA,IACA,CAAC,UAAU,OAAO,IAAI,SAAS,QAAQ,IAAI;AAAA,IAC3C,CAAC,cAAc,OAAO,OAAO,mBAAmB,QAAQ,IAAI;AAAA,IAC5D,CAAC,aAAa,OAAO,OAAO,QAAQ,UAAU,QAAQ,IAAI;AAAA,IAC1D,CAAC,mBAAmB,SAAS,SAAS,IAAI,SAAS,KAAK,IAAI,IAAI,MAAM;AAAA,EACxE;AAAA,EAEA,MAAM,aAAa,KAAK,IAAI,GAAG,KAAK,IAAI,EAAE,WAAW,MAAM,MAAM,CAAC,IAAI;AAAA,EACtE,OAAO,IACL,KACG,IAAI,EAAE,OAAO,WAAW,GAAG,MAAM,OAAO,UAAU,IAAI,OAAO,EAC7D,KAAK;AAAA,CAAI,CACd;AAAA,EAEA,MAAM,qBAAqB,SAAS,IAAI;AAAA,EAIxC,IAAI,QAAQ,eAAe,GAAG;AAAA,IAC5B,OAAO,KACL,GAAG,QAAQ,yEACb;AAAA,EACF;AAAA,EACA,OAAO,QAAQ,YAAY,SAAS;AAAA;AAG/B,IAAM,eAAe,cAAc;AAAA,EACxC,MAAM;AAAA,IACJ,SAAS;AAAA,MACP,aAAa;AAAA,MACb,MAAM;AAAA,IACR;AAAA,KACC,aAAa;AAAA,MACZ,aAAa;AAAA,MACb,MAAM;AAAA,IACR;AAAA,KACC,YAAY;AAAA,MACX,aAAa;AAAA,MACb,MAAM;AAAA,IACR;AAAA,IACA,UAAU;AAAA,MACR,aACE;AAAA,MACF,MAAM;AAAA,IACR;AAAA,IACA,SAAS;AAAA,MACP,aAAa;AAAA,MACb,MAAM;AAAA,IACR;AAAA,IACA,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,aACE;AAAA,MACF,MAAM;AAAA,IACR;AAAA,EACF;AAAA,EACA,MAAM,YAAY;AAAA,OACZ,IAAG,GAAG,MAAM,WAAW;AAAA,IAC3B,MAAM,OAAO,QAAQ,IAAI;AAAA,IAIzB,MAAM,UAAU,kBAAkB,OAAO;AAAA,IACzC,IAAI,QAAQ,SAAS,GAAG;AAAA,MACtB,OAAO,MACL,+BAA+B,SAAS,OAAO,MAAM,wBAAwB,OAAO,GACtF;AAAA,MACA,QAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,IACA,MAAM,gBAAgB,MAAM,OAAO;AAAA,IAMnC,MAAM,aAAa,KAAK,WACpB,kBACA,QAAQ,IAAI;AAAA,IAChB,mBAAmB,MAAM,YAAY,EAAE,cAAc,MAAM,WAAW,CAAC;AAAA,IACvE,IAAI,KAAK,UAAU;AAAA,MACjB,MAAM,gBAAgB,MAAM,CAAC,gBAAgB,CAAC;AAAA,IAChD;AAAA,IAEA,oBAAoB,IAAI;AAAA,IAExB,MAAM,UAAU,MAAM,eAAe;AAAA,MACnC,MAAM;AAAA,MACN,SAAS,KAAK;AAAA,MACd;AAAA,MACA;AAAA,MACA,QAAQ,KAAK;AAAA,IACf,CAAC;AAAA,IAED,OAAO,MACL,YAAY,QAAQ,MAAM,MAAM,mBAAmB,QAAQ,OAAO,WAAW,QAAQ,gBACvF;AAAA,IAQA,IAAI,CAAC,YAAY;AAAA,MACf,oBAAoB,OAAO;AAAA,IAC7B;AAAA,IAEA,IAAI;AAAA,MACF,MAAM,MAAM;AAAA,QACV,UAAU;AAAA,QACV,MAAM,QAAQ,QAAQ;AAAA,MACxB,CAAC;AAAA,MACD,OAAO,OAAO;AAAA,MAKd,IAAI,iBAAiB,cAAc,EAAE,iBAAiB,QAAQ;AAAA,QAC5D,MAAM;AAAA,MACR;AAAA,MACA,kBACE,MAAM,sBAAsB,OAAO;AAAA,QACjC,QAAQ,oBAAoB,OAAO;AAAA,QACnC;AAAA,MACF,CAAC,GACD,IACF;AAAA,MACA,QAAQ,KAAK,CAAC;AAAA;AAAA,IAKhB,MAAM,gBAAgB,SAAS,CAAC,UAAU;AAAA,IAM1C,QAAQ,eAAe,QAAQ;AAAA,IAC/B,MAAM,WAAW,eAAe,UAAU;AAAA,IAC1C,MAAM,SAAS,WAAW,QAAQ,WAAW;AAAA,IAC7C,MAAM,WAAW,OAAO,aAAqC;AAAA,MAC3D,IACE,UACA,SAAS,iBACT,CAAE,MAAM,SAAS,cAAc,EAAE,UAAU,KAAK,QAAQ,QAAQ,CAAC,GACjE;AAAA,QACA,QAAQ,KAAK,CAAC;AAAA,MAChB;AAAA;AAAA,IAQF,IAAI,YAAY;AAAA,MACd,MAAM,SAAS,IAAI;AAAA,MACnB,MAAM,qBACJ,gBAAgB,QAAQ,QAAQ,QAAQ,OAAO,GAC/C,IACF;AAAA,MACA,OAAO,QACL,iCAAiC,gBAAgB,QAAQ,QAAQ,QAAQ,OAAO,oBAClF;AAAA,MACA;AAAA,IACF;AAAA,IAMA,QAAQ,cAAc,SAAS;AAAA,IAC/B,IAAI,UAAU,WAAW;AAAA,MACvB,MAAM,gBAAgB,MAAM,CAAC,SAAS,CAAC;AAAA,IACzC;AAAA,IAMA,MAAM,WAAW,MAAM,qBACrB,QAAQ,QACR,QAAQ,OACV;AAAA,IACA,IAAI,SAAS,OAAO;AAAA,MAClB,OAAO,QAAQ,YAAY,WAAW,kBAAkB,SAAS,IAAI;AAAA,IACvE;AAAA,IAEA,MAAM,SAAS,KAAK;AAAA,IAEpB,MAAM,YACJ,SACA,gBAAgB,QAAQ,QAAQ,QAAQ,OAAO,GAC/C,IACF;AAAA;AAEJ,CAAC;",
8
+ "debugId": "43360653920765D464756E2164756E21",
9
+ "names": []
10
+ }
package/dist/cli/index.js CHANGED
@@ -80,7 +80,7 @@ var commandMeta = {
80
80
  name: "mcp-stdio"
81
81
  },
82
82
  migrate: {
83
- description: "Migrate a docs site from Mintlify, Fumadocs, Docusaurus, Starlight, or Nextra with a coding agent.",
83
+ description: "Migrate a docs site from Mintlify, Docusaurus, GitBook, MkDocs, ReadMe, or another framework with a coding agent.",
84
84
  name: "migrate"
85
85
  },
86
86
  preview: {
@@ -197,36 +197,61 @@ var DOCS_CONTENT_SOURCES = "/docs/content/sources";
197
197
  var DOCS_CONTENT_SOURCES_OBSIDIAN = "/docs/content/sources/obsidian";
198
198
  var DOCS_CONTENT_NAVIGATION = "/docs/content/navigation";
199
199
  var DOCS_CONTENT_INCLUDES = "/docs/content/includes";
200
+ var DOCS_OPENAPI_WARNINGS = "/docs/references/openapi#spec-warnings";
201
+ var DOCS_OTHER_TOOLS_SYNTAX = "/docs/content/syntax#syntax-from-other-tools";
202
+ var DOCS_MARKDOWN_AND_MDX = "/docs/content#markdown-and-mdx";
200
203
  var DOCS_PATHS = new Map(Object.entries({
201
204
  BLUME_ADAPTER_REQUIRED: DOCS_DEPLOYMENT,
202
- BLUME_ASSETS_UNCHECKED: DOCS_CLI_VALIDATE,
203
205
  BLUME_ASSET_FETCH_FAILED: DOCS_CONTENT_SOURCES,
204
206
  BLUME_BROKEN_ANCHOR: DOCS_CLI_VALIDATE,
205
207
  BLUME_BROKEN_ASSET: DOCS_CLI_VALIDATE,
206
208
  BLUME_BROKEN_LINK: DOCS_CLI_VALIDATE,
209
+ BLUME_BROKEN_REDIRECT: DOCS_CLI_VALIDATE,
210
+ BLUME_CODE_FENCE_OPTION: "/docs/content/syntax",
207
211
  BLUME_COMPONENTS_INVALID: "/docs/configuration/customization",
208
212
  BLUME_CONFIG_INVALID: "/docs/configuration",
209
213
  BLUME_CONFIG_LOAD_FAILED: "/docs/configuration",
210
214
  BLUME_CONTENT_ROOT_MISSING: DOCS_CONTENT_SOURCES,
211
215
  BLUME_DEAD_LINK: DOCS_CLI_VALIDATE,
212
216
  BLUME_DEPENDENCY_MISSING: "/docs/cli/doctor",
217
+ BLUME_DIRECTIVE_CLOSING_TEXT: "/docs/content/syntax",
218
+ BLUME_DIRECTIVE_OPENING_TEXT: "/docs/content/syntax",
219
+ BLUME_DIRECTIVE_SPACED_NAME: "/docs/content/syntax",
213
220
  BLUME_DUPLICATE_ROUTE: DOCS_CONTENT_NAVIGATION,
214
221
  BLUME_DUPLICATE_SIDEBAR_ORDER: DOCS_CONTENT_NAVIGATION,
215
222
  BLUME_EXAMPLE_NOT_FOUND: "/docs/content/components#component",
216
223
  BLUME_FRONTMATTER_INVALID: "/docs/content/frontmatter",
224
+ BLUME_GRAPHQL_UNKNOWN_CODE_SAMPLE: "/docs/references/graphql",
217
225
  BLUME_INCLUDE_CYCLE: DOCS_CONTENT_INCLUDES,
218
226
  BLUME_INCLUDE_MALFORMED: DOCS_CONTENT_INCLUDES,
219
227
  BLUME_INCLUDE_NOT_FOUND: DOCS_CONTENT_INCLUDES,
220
228
  BLUME_INCLUDE_OUTSIDE_ROOT: DOCS_CONTENT_INCLUDES,
229
+ BLUME_MDC_SYNTAX: DOCS_OTHER_TOOLS_SYNTAX,
230
+ BLUME_MDX_ATTRIBUTE_LIST: DOCS_OTHER_TOOLS_SYNTAX,
221
231
  BLUME_MDX_CURLY_ANCHOR: "/docs/content/syntax",
232
+ BLUME_MDX_EVENT_HANDLER: "/docs/content/islands",
233
+ BLUME_MDX_SYNTAX: DOCS_MARKDOWN_AND_MDX,
234
+ BLUME_MDX_UNCLOSED_ELEMENT: DOCS_OTHER_TOOLS_SYNTAX,
235
+ BLUME_MDX_UNDEFINED_NAME: DOCS_MARKDOWN_AND_MDX,
236
+ BLUME_MD_ATTRIBUTE_LIST: DOCS_OTHER_TOOLS_SYNTAX,
237
+ BLUME_MD_CURLY_ANCHOR: "/docs/content/syntax",
238
+ BLUME_MD_DIRECTIVE: "/docs/content/syntax",
239
+ BLUME_MD_GITHUB_ALERT: "/docs/content/syntax",
222
240
  BLUME_META_INVALID: "/docs/content/meta",
223
241
  BLUME_META_LOAD_FAILED: "/docs/content/meta",
242
+ BLUME_META_OUTSIDE_INCLUDE: "/docs/content/meta",
243
+ BLUME_META_UNKNOWN_PAGE: "/docs/content/meta",
224
244
  BLUME_MISSING_SECRET: DOCS_DEPLOYMENT,
225
245
  BLUME_NAV_DUPLICATE_LABEL: DOCS_CONTENT_NAVIGATION,
226
246
  BLUME_NAV_HIDDEN_IN_SIDEBAR: DOCS_CONTENT_NAVIGATION,
227
247
  BLUME_NAV_INDEX_TITLE_MISMATCH: DOCS_CONTENT_NAVIGATION,
228
248
  BLUME_NAV_MISSING_PAGE: DOCS_CONTENT_NAVIGATION,
229
249
  BLUME_NODE_VERSION: "/docs/quickstart",
250
+ BLUME_OPENAPI_DUPLICATE_OPERATION_ID: DOCS_OPENAPI_WARNINGS,
251
+ BLUME_OPENAPI_LOCAL_SERVER: DOCS_OPENAPI_WARNINGS,
252
+ BLUME_OPENAPI_NULLABLE: DOCS_OPENAPI_WARNINGS,
253
+ BLUME_OPENAPI_UNKNOWN_CODE_SAMPLE: "/docs/references/openapi#code-samples-and-schemas",
254
+ BLUME_PUBLIC_OPENAPI_JSON: "/docs/discoverability/json-api",
230
255
  BLUME_SEARCH_SYNC_FAILED: "/docs/configuration/search",
231
256
  BLUME_SERVER_FEATURE_REQUIRED: DOCS_DEPLOYMENT,
232
257
  BLUME_SIDEBAR_DISPLAY_IGNORED: DOCS_CONTENT_NAVIGATION,
@@ -238,15 +263,23 @@ var DOCS_PATHS = new Map(Object.entries({
238
263
  BLUME_SOURCE_UNAVAILABLE: DOCS_CONTENT_SOURCES,
239
264
  BLUME_SOURCE_UNRESOLVED_LINK: "/docs/content/sources/contentful",
240
265
  BLUME_SOURCE_UNSUPPORTED_NODE: "/docs/content/sources/payload",
266
+ BLUME_SVG_UNOPTIMIZED: "/docs/content/syntax#links-and-images",
267
+ BLUME_TEMPLATE_TAG: DOCS_OTHER_TOOLS_SYNTAX,
268
+ BLUME_THEME_COLOR_INVALID: "/docs/configuration/theming",
241
269
  BLUME_TRANSLATE_MISSING: "/docs/cli/translate",
242
270
  BLUME_TRANSLATE_STALE: "/docs/cli/translate",
271
+ BLUME_TSCONFIG_EXTENDS: "/docs/cli#type-checking",
272
+ BLUME_UNKNOWN_CODE_LANGUAGE: "/docs/content/syntax",
243
273
  BLUME_UNKNOWN_COMPONENT: "/docs/configuration/customization",
244
274
  BLUME_UNKNOWN_DIRECTIVE: "/docs/content/syntax",
245
275
  BLUME_UNKNOWN_ICON: DOCS_CONTENT_NAVIGATION,
246
276
  BLUME_UNKNOWN_OPTION: "/docs/cli",
277
+ BLUME_UNKNOWN_PROP: "/docs/content/components",
247
278
  BLUME_UNLOADABLE_FILE_NAME: "/docs/content",
279
+ BLUME_UNSUPPORTED_LINK_SCHEME: DOCS_CLI_VALIDATE,
248
280
  BLUME_WIKILINK_AMBIGUOUS: DOCS_CONTENT_SOURCES_OBSIDIAN,
249
281
  BLUME_WIKILINK_UNRESOLVED: DOCS_CONTENT_SOURCES_OBSIDIAN,
282
+ BLUME_WIKILINK_UNSUPPORTED: DOCS_OTHER_TOOLS_SYNTAX,
250
283
  BLUME_YARN_PNP: "/docs/quickstart"
251
284
  }));
252
285
  var resolveDocsUrl = (code) => {
@@ -515,6 +548,29 @@ ${summary}
515
548
  return hasErrors(diagnostics);
516
549
  };
517
550
 
551
+ // src/core/closest-match.ts
552
+ var distance = (from, to) => {
553
+ let previous = Array.from({ length: to.length + 1 }, (_, index) => index);
554
+ for (const [row, fromChar] of [...from].entries()) {
555
+ const current = [row + 1];
556
+ for (const [column, toChar] of [...to].entries()) {
557
+ current.push(Math.min((previous[column + 1] ?? 0) + 1, (current[column] ?? 0) + 1, (previous[column] ?? 0) + (fromChar === toChar ? 0 : 1)));
558
+ }
559
+ previous = current;
560
+ }
561
+ return previous[to.length] ?? 0;
562
+ };
563
+ var closestMatch = (name, candidates) => {
564
+ let best;
565
+ for (const candidate of candidates) {
566
+ const edits = distance(name, candidate);
567
+ if (edits <= 2 && edits * 2 < candidate.length && (best === undefined || edits < best.edits)) {
568
+ best = { candidate, edits };
569
+ }
570
+ }
571
+ return best?.candidate;
572
+ };
573
+
518
574
  // src/cli/unknown-flags.ts
519
575
  var kebabCase = (name) => name.replaceAll(/(?<upper>[A-Z])/gu, (letter) => `-${letter.toLowerCase()}`);
520
576
  var camelCase = (name) => name.replaceAll(/-(?<letter>[a-z])/gu, (match) => match.slice(1).toUpperCase());
@@ -550,27 +606,6 @@ var knownFlags = (argsDef) => {
550
606
  }
551
607
  return flags;
552
608
  };
553
- var distance = (from, to) => {
554
- let previous = Array.from({ length: to.length + 1 }, (_, index) => index);
555
- for (const [row, fromChar] of [...from].entries()) {
556
- const current = [row + 1];
557
- for (const [column, toChar] of [...to].entries()) {
558
- current.push(Math.min((previous[column + 1] ?? 0) + 1, (current[column] ?? 0) + 1, (previous[column] ?? 0) + (fromChar === toChar ? 0 : 1)));
559
- }
560
- previous = current;
561
- }
562
- return previous[to.length] ?? 0;
563
- };
564
- var closestMatch = (name, candidates) => {
565
- let best;
566
- for (const candidate of candidates) {
567
- const edits = distance(name, candidate);
568
- if (edits <= 2 && edits * 2 < candidate.length && (best === undefined || edits < best.edits)) {
569
- best = { candidate, edits };
570
- }
571
- }
572
- return best?.candidate;
573
- };
574
609
  var parseToken = (arg) => {
575
610
  const long = arg.startsWith("--");
576
611
  const [name = ""] = arg.slice(long ? 2 : 1).split("=");
@@ -690,24 +725,24 @@ var main = defineCommand({
690
725
  version: getBlumeVersion()
691
726
  },
692
727
  subCommands: {
693
- add: lazyCommand(commandMeta.add, () => import("./chunk-1f882900.js"), "addCommand"),
694
- audit: lazyCommand(commandMeta.audit, () => import("./chunk-32khwcb6.js"), "auditCommand"),
695
- build: lazyCommand(commandMeta.build, () => import("./chunk-36bxs9c7.js"), "buildCommand"),
696
- check: lazyCommand(commandMeta.check, () => import("./chunk-0w6hs479.js"), "checkCommand"),
697
- dev: lazyCommand(commandMeta.dev, () => import("./chunk-gxtg6ed2.js"), "devCommand"),
698
- doctor: lazyCommand(commandMeta.doctor, () => import("./chunk-twy7psdz.js"), "doctorCommand"),
699
- eject: lazyCommand(commandMeta.eject, () => import("./chunk-gfc5fqvf.js"), "ejectCommand"),
700
- eval: lazyCommand(commandMeta.eval, () => import("./chunk-bqxaqn5p.js"), "evalCommand"),
701
- init: lazyCommand(commandMeta.init, () => import("./chunk-sc93apfs.js"), "initCommand"),
702
- "mcp-stdio": lazyCommand(commandMeta["mcp-stdio"], () => import("./chunk-ave1wcbr.js"), "mcpStdioCommand"),
703
- migrate: lazyCommand(commandMeta.migrate, () => import("./chunk-kdpzw38a.js"), "migrateCommand"),
704
- preview: lazyCommand(commandMeta.preview, () => import("./chunk-ydp3065p.js"), "previewCommand"),
705
- skill: lazyCommand(commandMeta.skill, () => import("./chunk-a57yh0h9.js"), "skillCommand"),
706
- sync: lazyCommand(commandMeta.sync, () => import("./chunk-y4msrwm9.js"), "syncCommand"),
707
- translate: lazyCommand(commandMeta.translate, () => import("./chunk-bxwhtvw8.js"), "translateCommand"),
708
- upgrade: lazyCommand(commandMeta.upgrade, () => import("./chunk-hvcxng5f.js"), "upgradeCommand"),
709
- validate: lazyCommand(commandMeta.validate, () => import("./chunk-60hz265r.js"), "validateCommand"),
710
- version: lazyCommand(commandMeta.version, () => import("./chunk-58bt3hag.js"), "versionCommand")
728
+ add: lazyCommand(commandMeta.add, () => import("./chunk-th0pgaj5.js"), "addCommand"),
729
+ audit: lazyCommand(commandMeta.audit, () => import("./chunk-49r370mb.js"), "auditCommand"),
730
+ build: lazyCommand(commandMeta.build, () => import("./chunk-xt0qvz1t.js"), "buildCommand"),
731
+ check: lazyCommand(commandMeta.check, () => import("./chunk-rkqae7kh.js"), "checkCommand"),
732
+ dev: lazyCommand(commandMeta.dev, () => import("./chunk-vzy9rh6y.js"), "devCommand"),
733
+ doctor: lazyCommand(commandMeta.doctor, () => import("./chunk-enk76qd5.js"), "doctorCommand"),
734
+ eject: lazyCommand(commandMeta.eject, () => import("./chunk-br0n8n3e.js"), "ejectCommand"),
735
+ eval: lazyCommand(commandMeta.eval, () => import("./chunk-t5xx74rd.js"), "evalCommand"),
736
+ init: lazyCommand(commandMeta.init, () => import("./chunk-frk2wdq1.js"), "initCommand"),
737
+ "mcp-stdio": lazyCommand(commandMeta["mcp-stdio"], () => import("./chunk-m9bp2hc1.js"), "mcpStdioCommand"),
738
+ migrate: lazyCommand(commandMeta.migrate, () => import("./chunk-gprwej7h.js"), "migrateCommand"),
739
+ preview: lazyCommand(commandMeta.preview, () => import("./chunk-cn3dy3hz.js"), "previewCommand"),
740
+ skill: lazyCommand(commandMeta.skill, () => import("./chunk-dyk3r7jw.js"), "skillCommand"),
741
+ sync: lazyCommand(commandMeta.sync, () => import("./chunk-xgq4eytj.js"), "syncCommand"),
742
+ translate: lazyCommand(commandMeta.translate, () => import("./chunk-ahc5gc9h.js"), "translateCommand"),
743
+ upgrade: lazyCommand(commandMeta.upgrade, () => import("./chunk-7tekknev.js"), "upgradeCommand"),
744
+ validate: lazyCommand(commandMeta.validate, () => import("./chunk-dpcahcrb.js"), "validateCommand"),
745
+ version: lazyCommand(commandMeta.version, () => import("./chunk-mrvh4c88.js"), "versionCommand")
711
746
  }
712
747
  });
713
748
  loadEnvFiles(process.cwd());
@@ -729,6 +764,7 @@ export {
729
764
  reportInternalError,
730
765
  BlumeError,
731
766
  enrichDiagnostic,
767
+ locatePath,
732
768
  locateFrontmatterKey,
733
769
  diagnosticsFromIssues,
734
770
  diagnosticsFromZod,
@@ -742,5 +778,5 @@ export {
742
778
  closestMatch
743
779
  };
744
780
 
745
- //# debugId=D285C7A054BEC2C764756E2164756E21
781
+ //# debugId=0853E5F28957397564756E2164756E21
746
782
  //# sourceMappingURL=index.js.map