blume 1.5.3 → 1.6.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 (209) hide show
  1. package/CHANGELOG.md +94 -0
  2. package/dist/cli/index.js +3949 -1403
  3. package/dist/cli/index.js.map +111 -96
  4. package/dist/types/ai/component-markdown.d.ts +79 -0
  5. package/dist/types/components/layout/nav-utils.d.ts +60 -0
  6. package/dist/types/core/base-path.d.ts +9 -0
  7. package/dist/types/core/config-input.d.ts +206 -4
  8. package/dist/types/core/config.d.ts +6 -4
  9. package/dist/types/core/data.d.ts +33 -2
  10. package/dist/types/core/github.d.ts +35 -0
  11. package/dist/types/core/i18n-ui.d.ts +10 -0
  12. package/dist/types/core/navigation.d.ts +69 -0
  13. package/dist/types/core/schema.d.ts +122 -1
  14. package/dist/types/core/sources/types.d.ts +31 -6
  15. package/dist/types/core/types.d.ts +29 -2
  16. package/dist/types/markdown/features.d.ts +21 -0
  17. package/dist/types/openapi/references.d.ts +26 -1
  18. package/dist/types/seo/jsonld.d.ts +105 -0
  19. package/dist/types/theme/fonts.d.ts +34 -4
  20. package/docs/07-faq.mdx +9 -9
  21. package/docs/_snippets/include-demo.mdx +7 -0
  22. package/docs/advanced/api-reference.mdx +13 -4
  23. package/docs/advanced/custom-pages.mdx +4 -2
  24. package/docs/advanced/graphql.mdx +84 -0
  25. package/docs/advanced/meta.ts +8 -1
  26. package/docs/configuration/ai.mdx +25 -3
  27. package/docs/configuration/index.mdx +24 -0
  28. package/docs/configuration/search.mdx +13 -1
  29. package/docs/configuration/seo.mdx +30 -3
  30. package/docs/configuration/theming.mdx +23 -0
  31. package/docs/content/components.mdx +15 -1
  32. package/docs/content/includes.mdx +68 -0
  33. package/docs/content/meta.ts +1 -0
  34. package/docs/content/navigation.mdx +25 -0
  35. package/docs/content/sources.mdx +42 -1
  36. package/docs/content/syntax.mdx +69 -1
  37. package/docs/content/versioning.mdx +15 -9
  38. package/docs/reference/cli.mdx +2 -1
  39. package/package.json +66 -57
  40. package/skills/blume-migrate/SKILL.md +16 -7
  41. package/skills/blume-migrate/references/docusaurus.md +5 -3
  42. package/skills/blume-migrate/references/fumadocs.md +10 -2
  43. package/skills/blume-migrate/references/mintlify.md +3 -2
  44. package/skills/blume-migrate/references/nextra.md +2 -2
  45. package/skills/blume-migrate/references/starlight.md +1 -1
  46. package/src/ai/agent-readability.ts +2 -1
  47. package/src/ai/ask-data.ts +2 -1
  48. package/src/ai/component-markdown.ts +199 -36
  49. package/src/ai/llms.ts +93 -6
  50. package/src/ai/markdown.ts +2 -2
  51. package/src/ai/mcp/discovery.ts +10 -2
  52. package/src/ai/mcp/server.ts +74 -2
  53. package/src/astro/examples.ts +29 -2
  54. package/src/astro/generate.ts +282 -177
  55. package/src/astro/include-hmr.ts +81 -0
  56. package/src/astro/include-refresh.ts +0 -0
  57. package/src/astro/index.ts +10 -5
  58. package/src/astro/markdown-negotiation.ts +1 -1
  59. package/src/astro/runtime-modules.ts +196 -0
  60. package/src/astro/templates.ts +365 -113
  61. package/src/cli/commands/build.ts +91 -16
  62. package/src/cli/commands/dev.ts +6 -3
  63. package/src/cli/host-args.ts +18 -0
  64. package/src/cli/index.ts +2 -1
  65. package/src/cli/init/questions.ts +1 -0
  66. package/src/cli/init/scaffold.ts +27 -4
  67. package/src/components/colors.ts +142 -0
  68. package/src/components/content/Badge.astro +5 -12
  69. package/src/components/content/Callout.astro +19 -36
  70. package/src/components/content/Card.astro +15 -21
  71. package/src/components/content/Component.astro +10 -1
  72. package/src/components/content/GithubInfo.astro +28 -9
  73. package/src/components/content/Tabs.astro +27 -5
  74. package/src/components/content/github-info.ts +20 -5
  75. package/src/components/copy-feedback.ts +93 -9
  76. package/src/components/dropdown-dismiss.ts +122 -0
  77. package/src/components/islands/ask-ai.tsx +4 -1
  78. package/src/components/islands/hooks.ts +3 -1
  79. package/src/components/layout/Fonts.astro +15 -8
  80. package/src/components/layout/Header.astro +44 -0
  81. package/src/components/layout/LanguageSwitcher.astro +9 -1
  82. package/src/components/layout/NavSelector.astro +12 -3
  83. package/src/components/layout/NavTree.astro +6 -18
  84. package/src/components/layout/PageActions.astro +54 -22
  85. package/src/components/layout/PageLayout.astro +2 -0
  86. package/src/components/layout/ReferenceLayout.astro +6 -1
  87. package/src/components/layout/RootLayout.astro +42 -15
  88. package/src/components/layout/Search.astro +36 -4
  89. package/src/components/layout/TableOfContents.astro +8 -2
  90. package/src/components/layout/head-scripts.ts +30 -1
  91. package/src/components/openapi/ApiOverview.astro +13 -3
  92. package/src/components/openapi/AsyncApiOperation.astro +7 -14
  93. package/src/components/openapi/GraphqlChip.astro +33 -0
  94. package/src/components/openapi/GraphqlFieldsTable.astro +111 -0
  95. package/src/components/openapi/GraphqlOperation.astro +186 -0
  96. package/src/components/openapi/GraphqlType.astro +154 -0
  97. package/src/components/openapi/MethodBadge.astro +3 -14
  98. package/src/components/openapi/Operation.astro +12 -5
  99. package/src/components/openapi/OperationPanel.astro +43 -0
  100. package/src/components/openapi/RequestPanel.astro +5 -10
  101. package/src/components/openapi/Responses.astro +1 -16
  102. package/src/components/openapi/graphql-helpers.ts +466 -0
  103. package/src/components/openapi/playground-client.ts +15 -0
  104. package/src/components/openapi/sample-panels.ts +45 -0
  105. package/src/components/openapi/snippets.ts +13 -35
  106. package/src/core/base-path.ts +11 -0
  107. package/src/core/config-input.ts +209 -2
  108. package/src/core/config.ts +6 -4
  109. package/src/core/content-assets.ts +15 -4
  110. package/src/core/data.ts +28 -3
  111. package/src/core/define-components.ts +2 -0
  112. package/src/core/diagnostics.ts +8 -0
  113. package/src/core/frontmatter.ts +20 -8
  114. package/src/core/github.ts +71 -0
  115. package/src/core/graph.ts +22 -8
  116. package/src/core/heading-markers.ts +96 -0
  117. package/src/core/i18n-ui.ts +12 -0
  118. package/src/core/includes.ts +633 -0
  119. package/src/core/last-modified.ts +36 -11
  120. package/src/core/links.ts +79 -13
  121. package/src/core/manifest.ts +10 -0
  122. package/src/core/meta.ts +2 -1
  123. package/src/core/nav-diagnostics.ts +11 -2
  124. package/src/core/navigation.ts +27 -6
  125. package/src/core/project-graph.ts +61 -9
  126. package/src/core/schema.ts +235 -36
  127. package/src/core/server-features.ts +5 -9
  128. package/src/core/sources/github-releases.ts +2 -2
  129. package/src/core/sources/normalize.ts +502 -115
  130. package/src/core/sources/notion.ts +43 -8
  131. package/src/core/sources/obsidian.ts +1038 -0
  132. package/src/core/sources/read.ts +36 -1
  133. package/src/core/sources/resolve.ts +34 -1
  134. package/src/core/sources/types.ts +28 -6
  135. package/src/core/sources/watch.ts +12 -8
  136. package/src/core/tsconfig-aliases.ts +48 -35
  137. package/src/core/types.ts +31 -2
  138. package/src/core/ui-packs/ar.ts +2 -0
  139. package/src/core/ui-packs/bg.ts +3 -0
  140. package/src/core/ui-packs/bn.ts +2 -0
  141. package/src/core/ui-packs/ca.ts +3 -0
  142. package/src/core/ui-packs/cs.ts +2 -0
  143. package/src/core/ui-packs/da.ts +2 -0
  144. package/src/core/ui-packs/de.ts +3 -0
  145. package/src/core/ui-packs/el.ts +3 -0
  146. package/src/core/ui-packs/es.ts +3 -0
  147. package/src/core/ui-packs/fa.ts +2 -0
  148. package/src/core/ui-packs/fi.ts +2 -0
  149. package/src/core/ui-packs/fr.ts +3 -0
  150. package/src/core/ui-packs/he.ts +2 -0
  151. package/src/core/ui-packs/hi.ts +2 -0
  152. package/src/core/ui-packs/hr.ts +3 -0
  153. package/src/core/ui-packs/hu.ts +3 -0
  154. package/src/core/ui-packs/id.ts +3 -0
  155. package/src/core/ui-packs/it.ts +2 -0
  156. package/src/core/ui-packs/ja.ts +3 -0
  157. package/src/core/ui-packs/ko.ts +3 -0
  158. package/src/core/ui-packs/nl.ts +3 -0
  159. package/src/core/ui-packs/no.ts +3 -0
  160. package/src/core/ui-packs/pl.ts +3 -0
  161. package/src/core/ui-packs/pt-br.ts +3 -0
  162. package/src/core/ui-packs/pt.ts +3 -0
  163. package/src/core/ui-packs/ro.ts +3 -0
  164. package/src/core/ui-packs/ru.ts +3 -0
  165. package/src/core/ui-packs/sk.ts +2 -0
  166. package/src/core/ui-packs/sr.ts +2 -0
  167. package/src/core/ui-packs/sv.ts +3 -0
  168. package/src/core/ui-packs/th.ts +2 -0
  169. package/src/core/ui-packs/tr.ts +3 -0
  170. package/src/core/ui-packs/uk.ts +3 -0
  171. package/src/core/ui-packs/vi.ts +2 -0
  172. package/src/core/ui-packs/zh-tw.ts +2 -0
  173. package/src/core/ui-packs/zh.ts +2 -0
  174. package/src/core/version-cut.ts +26 -6
  175. package/src/core/yaml.ts +26 -0
  176. package/src/deploy/function-bundle.ts +251 -0
  177. package/src/deploy/vercel-negotiation.ts +49 -6
  178. package/src/eval/schema.ts +3 -1
  179. package/src/markdown/code-title.ts +22 -16
  180. package/src/markdown/features.ts +21 -0
  181. package/src/markdown/fence-meta.ts +50 -0
  182. package/src/markdown/heading-anchors.ts +198 -37
  183. package/src/markdown/include.ts +247 -0
  184. package/src/markdown/index.ts +43 -34
  185. package/src/markdown/language-icon.ts +2 -2
  186. package/src/markdown/mdast.ts +7 -3
  187. package/src/markdown/ts2js.ts +264 -0
  188. package/src/og/card.ts +1 -1
  189. package/src/openapi/asyncapi.ts +4 -1
  190. package/src/openapi/graphql-build.ts +293 -0
  191. package/src/openapi/graphql.ts +212 -0
  192. package/src/openapi/model.ts +38 -5
  193. package/src/openapi/parse.ts +34 -0
  194. package/src/openapi/proxy.ts +30 -5
  195. package/src/openapi/references.ts +97 -13
  196. package/src/openapi/render-mdx.ts +66 -12
  197. package/src/openapi/scalar.ts +5 -16
  198. package/src/openapi/source.ts +91 -23
  199. package/src/registry/eject.ts +47 -17
  200. package/src/search/documents.ts +229 -37
  201. package/src/search/orama-index.ts +9 -5
  202. package/src/seo/jsonld.ts +293 -51
  203. package/src/theme/code-block-padding.ts +16 -0
  204. package/src/theme/entry.ts +67 -13
  205. package/src/theme/fonts.ts +189 -16
  206. package/src/theme/sources.ts +49 -0
  207. package/src/translate/prompts.ts +2 -0
  208. package/src/translate/run.ts +7 -0
  209. package/src/translate/work-list.ts +0 -0
@@ -11,6 +11,7 @@ export const hi: UIStringsOverride = {
11
11
  copyClaudeCode: "Claude Code कमांड कॉपी करें",
12
12
  copyCode: "कोड कॉपी करें",
13
13
  copyCodex: "Codex कमांड कॉपी करें",
14
+ copyFailed: "कॉपी विफल रहा",
14
15
  copyMarkdown: "Markdown के रूप में कॉपी करें",
15
16
  copyServerUrl: "सर्वर URL कॉपी करें",
16
17
  edit: "GitHub पर संपादित करें",
@@ -20,6 +21,7 @@ export const hi: UIStringsOverride = {
20
21
  generating: "जनरेट हो रहा है…",
21
22
  openIn: "{name} में खोलें",
22
23
  openInChat: "चैट में खोलें",
24
+ openInChatPrompt: "{url} पढ़ें ताकि मैं इस पेज के बारे में प्रश्न पूछ सकूँ।",
23
25
  scrollToTop: "ऊपर जाएँ",
24
26
  },
25
27
  ask: {
@@ -11,6 +11,7 @@ export const hr: UIStringsOverride = {
11
11
  copyClaudeCode: "Kopiraj naredbu Claude Code",
12
12
  copyCode: "Kopiraj kôd",
13
13
  copyCodex: "Kopiraj naredbu Codex",
14
+ copyFailed: "Kopiranje nije uspjelo",
14
15
  copyMarkdown: "Kopiraj kao Markdown",
15
16
  copyServerUrl: "Kopiraj URL poslužitelja",
16
17
  edit: "Uredi na GitHubu",
@@ -20,6 +21,8 @@ export const hr: UIStringsOverride = {
20
21
  generating: "Generiranje…",
21
22
  openIn: "Otvori u {name}",
22
23
  openInChat: "Otvori u chatu",
24
+ openInChatPrompt:
25
+ "Pročitajte {url} — postavljat ću pitanja o ovoj stranici.",
23
26
  scrollToTop: "Natrag na vrh",
24
27
  },
25
28
  ask: {
@@ -11,6 +11,7 @@ export const hu: UIStringsOverride = {
11
11
  copyClaudeCode: "Claude Code parancs másolása",
12
12
  copyCode: "Kód másolása",
13
13
  copyCodex: "Codex parancs másolása",
14
+ copyFailed: "A másolás nem sikerült",
14
15
  copyMarkdown: "Másolás Markdownként",
15
16
  copyServerUrl: "Szerver URL másolása",
16
17
  edit: "Szerkesztés a GitHubon",
@@ -20,6 +21,8 @@ export const hu: UIStringsOverride = {
20
21
  generating: "Generálás…",
21
22
  openIn: "Megnyitás itt: {name}",
22
23
  openInChat: "Megnyitás a csevegésben",
24
+ openInChatPrompt:
25
+ "Olvasd el a következőt: {url}, hogy kérdéseket tehessek fel erről az oldalról.",
23
26
  scrollToTop: "Vissza a tetejére",
24
27
  },
25
28
  ask: {
@@ -11,6 +11,7 @@ export const id: UIStringsOverride = {
11
11
  copyClaudeCode: "Salin perintah Claude Code",
12
12
  copyCode: "Salin kode",
13
13
  copyCodex: "Salin perintah Codex",
14
+ copyFailed: "Gagal menyalin",
14
15
  copyMarkdown: "Salin sebagai Markdown",
15
16
  copyServerUrl: "Salin URL server",
16
17
  edit: "Edit di GitHub",
@@ -20,6 +21,8 @@ export const id: UIStringsOverride = {
20
21
  generating: "Menghasilkan…",
21
22
  openIn: "Buka di {name}",
22
23
  openInChat: "Buka di obrolan",
24
+ openInChatPrompt:
25
+ "Baca {url} agar saya bisa mengajukan pertanyaan tentang halaman ini.",
23
26
  scrollToTop: "Kembali ke atas",
24
27
  },
25
28
  ask: {
@@ -11,6 +11,7 @@ export const it: UIStringsOverride = {
11
11
  copyClaudeCode: "Copia comando di Claude Code",
12
12
  copyCode: "Copia codice",
13
13
  copyCodex: "Copia comando di Codex",
14
+ copyFailed: "Copia non riuscita",
14
15
  copyMarkdown: "Copia come Markdown",
15
16
  copyServerUrl: "Copia URL del server",
16
17
  edit: "Modifica su GitHub",
@@ -20,6 +21,7 @@ export const it: UIStringsOverride = {
20
21
  generating: "Generazione in corso…",
21
22
  openIn: "Apri in {name}",
22
23
  openInChat: "Apri nella chat",
24
+ openInChatPrompt: "Leggi {url} così posso farti domande su questa pagina.",
23
25
  scrollToTop: "Torna su",
24
26
  },
25
27
  ask: {
@@ -11,6 +11,7 @@ export const ja: UIStringsOverride = {
11
11
  copyClaudeCode: "Claude Code コマンドをコピー",
12
12
  copyCode: "コードをコピー",
13
13
  copyCodex: "Codex コマンドをコピー",
14
+ copyFailed: "コピーに失敗しました",
14
15
  copyMarkdown: "Markdown としてコピー",
15
16
  copyServerUrl: "サーバー URL をコピー",
16
17
  edit: "GitHub で編集",
@@ -20,6 +21,8 @@ export const ja: UIStringsOverride = {
20
21
  generating: "生成中…",
21
22
  openIn: "{name} で開く",
22
23
  openInChat: "チャットで開く",
24
+ openInChatPrompt:
25
+ "{url} を読んで、このページについての質問に答えられるようにしてください。",
23
26
  scrollToTop: "トップに戻る",
24
27
  },
25
28
  ask: {
@@ -11,6 +11,7 @@ export const ko: UIStringsOverride = {
11
11
  copyClaudeCode: "Claude Code 명령 복사",
12
12
  copyCode: "코드 복사",
13
13
  copyCodex: "Codex 명령 복사",
14
+ copyFailed: "복사 실패",
14
15
  copyMarkdown: "Markdown으로 복사",
15
16
  copyServerUrl: "서버 URL 복사",
16
17
  edit: "GitHub에서 편집",
@@ -20,6 +21,8 @@ export const ko: UIStringsOverride = {
20
21
  generating: "생성 중…",
21
22
  openIn: "{name}에서 열기",
22
23
  openInChat: "채팅에서 열기",
24
+ openInChatPrompt:
25
+ "{url} 페이지를 읽어 주세요. 이 페이지에 대해 질문하겠습니다.",
23
26
  scrollToTop: "맨 위로",
24
27
  },
25
28
  ask: {
@@ -11,6 +11,7 @@ export const nl: UIStringsOverride = {
11
11
  copyClaudeCode: "Claude Code-opdracht kopiëren",
12
12
  copyCode: "Code kopiëren",
13
13
  copyCodex: "Codex-opdracht kopiëren",
14
+ copyFailed: "Kopiëren mislukt",
14
15
  copyMarkdown: "Kopiëren als Markdown",
15
16
  copyServerUrl: "Server-URL kopiëren",
16
17
  edit: "Bewerken op GitHub",
@@ -20,6 +21,8 @@ export const nl: UIStringsOverride = {
20
21
  generating: "Genereren…",
21
22
  openIn: "Openen in {name}",
22
23
  openInChat: "Openen in chat",
24
+ openInChatPrompt:
25
+ "Lees {url}, zodat ik je vragen kan stellen over deze pagina.",
23
26
  scrollToTop: "Naar boven scrollen",
24
27
  },
25
28
  ask: {
@@ -11,6 +11,7 @@ export const no: UIStringsOverride = {
11
11
  copyClaudeCode: "Kopier Claude Code-kommando",
12
12
  copyCode: "Kopier kode",
13
13
  copyCodex: "Kopier Codex-kommando",
14
+ copyFailed: "Kopiering mislyktes",
14
15
  copyMarkdown: "Kopier som Markdown",
15
16
  copyServerUrl: "Kopier server-URL",
16
17
  edit: "Rediger på GitHub",
@@ -20,6 +21,8 @@ export const no: UIStringsOverride = {
20
21
  generating: "Genererer…",
21
22
  openIn: "Åpne i {name}",
22
23
  openInChat: "Åpne i chat",
24
+ openInChatPrompt:
25
+ "Les {url}, slik at jeg kan stille spørsmål om denne siden.",
23
26
  scrollToTop: "Til toppen",
24
27
  },
25
28
  ask: {
@@ -11,6 +11,7 @@ export const pl: UIStringsOverride = {
11
11
  copyClaudeCode: "Kopiuj polecenie Claude Code",
12
12
  copyCode: "Kopiuj kod",
13
13
  copyCodex: "Kopiuj polecenie Codex",
14
+ copyFailed: "Kopiowanie nie powiodło się",
14
15
  copyMarkdown: "Kopiuj jako Markdown",
15
16
  copyServerUrl: "Kopiuj adres URL serwera",
16
17
  edit: "Edytuj na GitHubie",
@@ -20,6 +21,8 @@ export const pl: UIStringsOverride = {
20
21
  generating: "Generowanie…",
21
22
  openIn: "Otwórz w {name}",
22
23
  openInChat: "Otwórz w czacie",
24
+ openInChatPrompt:
25
+ "Przeczytaj {url}, aby móc odpowiadać na pytania dotyczące tej strony.",
23
26
  scrollToTop: "Wróć na górę",
24
27
  },
25
28
  ask: {
@@ -11,6 +11,7 @@ export const ptBR: UIStringsOverride = {
11
11
  copyClaudeCode: "Copiar comando do Claude Code",
12
12
  copyCode: "Copiar código",
13
13
  copyCodex: "Copiar comando do Codex",
14
+ copyFailed: "Falha ao copiar",
14
15
  copyMarkdown: "Copiar como Markdown",
15
16
  copyServerUrl: "Copiar URL do servidor",
16
17
  edit: "Editar no GitHub",
@@ -20,6 +21,8 @@ export const ptBR: UIStringsOverride = {
20
21
  generating: "Gerando…",
21
22
  openIn: "Abrir em {name}",
22
23
  openInChat: "Abrir no chat",
24
+ openInChatPrompt:
25
+ "Leia {url} para que eu possa fazer perguntas sobre esta página.",
23
26
  scrollToTop: "Voltar ao topo",
24
27
  },
25
28
  ask: {
@@ -11,6 +11,7 @@ export const pt: UIStringsOverride = {
11
11
  copyClaudeCode: "Copiar comando do Claude Code",
12
12
  copyCode: "Copiar código",
13
13
  copyCodex: "Copiar comando do Codex",
14
+ copyFailed: "Falha ao copiar",
14
15
  copyMarkdown: "Copiar como Markdown",
15
16
  copyServerUrl: "Copiar URL do servidor",
16
17
  edit: "Editar no GitHub",
@@ -20,6 +21,8 @@ export const pt: UIStringsOverride = {
20
21
  generating: "A gerar…",
21
22
  openIn: "Abrir em {name}",
22
23
  openInChat: "Abrir no chat",
24
+ openInChatPrompt:
25
+ "Leia {url} para que eu possa fazer perguntas sobre esta página.",
23
26
  scrollToTop: "Voltar ao topo",
24
27
  },
25
28
  ask: {
@@ -11,6 +11,7 @@ export const ro: UIStringsOverride = {
11
11
  copyClaudeCode: "Copiază comanda Claude Code",
12
12
  copyCode: "Copiază codul",
13
13
  copyCodex: "Copiază comanda Codex",
14
+ copyFailed: "Copierea a eșuat",
14
15
  copyMarkdown: "Copiază ca Markdown",
15
16
  copyServerUrl: "Copiază URL-ul serverului",
16
17
  edit: "Editează pe GitHub",
@@ -20,6 +21,8 @@ export const ro: UIStringsOverride = {
20
21
  generating: "Se generează…",
21
22
  openIn: "Deschide în {name}",
22
23
  openInChat: "Deschide în chat",
24
+ openInChatPrompt:
25
+ "Citește {url} ca să îți pot pune întrebări despre această pagină.",
23
26
  scrollToTop: "Sus de tot",
24
27
  },
25
28
  ask: {
@@ -11,6 +11,7 @@ export const ru: UIStringsOverride = {
11
11
  copyClaudeCode: "Скопировать команду Claude Code",
12
12
  copyCode: "Скопировать код",
13
13
  copyCodex: "Скопировать команду Codex",
14
+ copyFailed: "Не удалось скопировать",
14
15
  copyMarkdown: "Скопировать как Markdown",
15
16
  copyServerUrl: "Скопировать URL сервера",
16
17
  edit: "Редактировать на GitHub",
@@ -20,6 +21,8 @@ export const ru: UIStringsOverride = {
20
21
  generating: "Генерация…",
21
22
  openIn: "Открыть в {name}",
22
23
  openInChat: "Открыть в чате",
24
+ openInChatPrompt:
25
+ "Прочитайте {url} — я буду задавать вопросы об этой странице.",
23
26
  scrollToTop: "Наверх",
24
27
  },
25
28
  ask: {
@@ -11,6 +11,7 @@ export const sk: UIStringsOverride = {
11
11
  copyClaudeCode: "Kopírovať príkaz Claude Code",
12
12
  copyCode: "Kopírovať kód",
13
13
  copyCodex: "Kopírovať príkaz Codex",
14
+ copyFailed: "Kopírovanie zlyhalo",
14
15
  copyMarkdown: "Kopírovať ako Markdown",
15
16
  copyServerUrl: "Kopírovať URL servera",
16
17
  edit: "Upraviť na GitHube",
@@ -20,6 +21,7 @@ export const sk: UIStringsOverride = {
20
21
  generating: "Generovanie…",
21
22
  openIn: "Otvoriť v {name}",
22
23
  openInChat: "Otvoriť v chate",
24
+ openInChatPrompt: "Prečítajte si {url} — budem sa pýtať na túto stránku.",
23
25
  scrollToTop: "Späť nahor",
24
26
  },
25
27
  ask: {
@@ -11,6 +11,7 @@ export const sr: UIStringsOverride = {
11
11
  copyClaudeCode: "Копирај Claude Code команду",
12
12
  copyCode: "Копирај код",
13
13
  copyCodex: "Копирај Codex команду",
14
+ copyFailed: "Копирање није успело",
14
15
  copyMarkdown: "Копирај као Markdown",
15
16
  copyServerUrl: "Копирај URL сервера",
16
17
  edit: "Уреди на GitHub-у",
@@ -20,6 +21,7 @@ export const sr: UIStringsOverride = {
20
21
  generating: "Генерисање…",
21
22
  openIn: "Отвори у {name}",
22
23
  openInChat: "Отвори у ћаскању",
24
+ openInChatPrompt: "Прочитајте {url} — постављаћу питања о овој страници.",
23
25
  scrollToTop: "Назад на врх",
24
26
  },
25
27
  ask: {
@@ -11,6 +11,7 @@ export const sv: UIStringsOverride = {
11
11
  copyClaudeCode: "Kopiera Claude Code-kommando",
12
12
  copyCode: "Kopiera kod",
13
13
  copyCodex: "Kopiera Codex-kommando",
14
+ copyFailed: "Kopiering misslyckades",
14
15
  copyMarkdown: "Kopiera som Markdown",
15
16
  copyServerUrl: "Kopiera server-URL",
16
17
  edit: "Redigera på GitHub",
@@ -20,6 +21,8 @@ export const sv: UIStringsOverride = {
20
21
  generating: "Genererar…",
21
22
  openIn: "Öppna i {name}",
22
23
  openInChat: "Öppna i chatt",
24
+ openInChatPrompt:
25
+ "Läs {url} så att jag kan ställa frågor om den här sidan.",
23
26
  scrollToTop: "Till toppen",
24
27
  },
25
28
  ask: {
@@ -11,6 +11,7 @@ export const th: UIStringsOverride = {
11
11
  copyClaudeCode: "คัดลอกคำสั่ง Claude Code",
12
12
  copyCode: "คัดลอกโค้ด",
13
13
  copyCodex: "คัดลอกคำสั่ง Codex",
14
+ copyFailed: "คัดลอกไม่สำเร็จ",
14
15
  copyMarkdown: "คัดลอกเป็น Markdown",
15
16
  copyServerUrl: "คัดลอก URL ของเซิร์ฟเวอร์",
16
17
  edit: "แก้ไขบน GitHub",
@@ -20,6 +21,7 @@ export const th: UIStringsOverride = {
20
21
  generating: "กำลังสร้าง…",
21
22
  openIn: "เปิดใน {name}",
22
23
  openInChat: "เปิดในแชท",
24
+ openInChatPrompt: "อ่าน {url} เพื่อให้ฉันถามคำถามเกี่ยวกับหน้านี้ได้",
23
25
  scrollToTop: "กลับไปด้านบน",
24
26
  },
25
27
  ask: {
@@ -11,6 +11,7 @@ export const tr: UIStringsOverride = {
11
11
  copyClaudeCode: "Claude Code komutunu kopyala",
12
12
  copyCode: "Kodu kopyala",
13
13
  copyCodex: "Codex komutunu kopyala",
14
+ copyFailed: "Kopyalama başarısız oldu",
14
15
  copyMarkdown: "Markdown olarak kopyala",
15
16
  copyServerUrl: "Sunucu URL'sini kopyala",
16
17
  edit: "GitHub'da düzenle",
@@ -20,6 +21,8 @@ export const tr: UIStringsOverride = {
20
21
  generating: "Oluşturuluyor…",
21
22
  openIn: "{name} içinde aç",
22
23
  openInChat: "Sohbette aç",
24
+ openInChatPrompt:
25
+ "Bu sayfa hakkında sorular sorabilmem için {url} adresini okuyun.",
23
26
  scrollToTop: "Başa dön",
24
27
  },
25
28
  ask: {
@@ -11,6 +11,7 @@ export const uk: UIStringsOverride = {
11
11
  copyClaudeCode: "Скопіювати команду Claude Code",
12
12
  copyCode: "Скопіювати код",
13
13
  copyCodex: "Скопіювати команду Codex",
14
+ copyFailed: "Не вдалося скопіювати",
14
15
  copyMarkdown: "Скопіювати як Markdown",
15
16
  copyServerUrl: "Скопіювати URL сервера",
16
17
  edit: "Редагувати на GitHub",
@@ -20,6 +21,8 @@ export const uk: UIStringsOverride = {
20
21
  generating: "Генерація…",
21
22
  openIn: "Відкрити в {name}",
22
23
  openInChat: "Відкрити в чаті",
24
+ openInChatPrompt:
25
+ "Прочитайте {url} — я ставитиму запитання щодо цієї сторінки.",
23
26
  scrollToTop: "Нагору",
24
27
  },
25
28
  ask: {
@@ -11,6 +11,7 @@ export const vi: UIStringsOverride = {
11
11
  copyClaudeCode: "Sao chép lệnh Claude Code",
12
12
  copyCode: "Sao chép mã",
13
13
  copyCodex: "Sao chép lệnh Codex",
14
+ copyFailed: "Sao chép thất bại",
14
15
  copyMarkdown: "Sao chép dưới dạng Markdown",
15
16
  copyServerUrl: "Sao chép URL máy chủ",
16
17
  edit: "Chỉnh sửa trên GitHub",
@@ -20,6 +21,7 @@ export const vi: UIStringsOverride = {
20
21
  generating: "Đang tạo…",
21
22
  openIn: "Mở trong {name}",
22
23
  openInChat: "Mở trong trò chuyện",
24
+ openInChatPrompt: "Hãy đọc {url} để tôi có thể đặt câu hỏi về trang này.",
23
25
  scrollToTop: "Lên đầu trang",
24
26
  },
25
27
  ask: {
@@ -11,6 +11,7 @@ export const zhTW: UIStringsOverride = {
11
11
  copyClaudeCode: "複製 Claude Code 指令",
12
12
  copyCode: "複製程式碼",
13
13
  copyCodex: "複製 Codex 指令",
14
+ copyFailed: "複製失敗",
14
15
  copyMarkdown: "複製為 Markdown",
15
16
  copyServerUrl: "複製伺服器 URL",
16
17
  edit: "在 GitHub 上編輯",
@@ -20,6 +21,7 @@ export const zhTW: UIStringsOverride = {
20
21
  generating: "產生中…",
21
22
  openIn: "在 {name} 中開啟",
22
23
  openInChat: "在聊天中開啟",
24
+ openInChatPrompt: "請閱讀 {url} 以便我針對此頁面提問。",
23
25
  scrollToTop: "回到頂部",
24
26
  },
25
27
  ask: {
@@ -11,6 +11,7 @@ export const zh: UIStringsOverride = {
11
11
  copyClaudeCode: "复制 Claude Code 命令",
12
12
  copyCode: "复制代码",
13
13
  copyCodex: "复制 Codex 命令",
14
+ copyFailed: "复制失败",
14
15
  copyMarkdown: "复制为 Markdown",
15
16
  copyServerUrl: "复制服务器 URL",
16
17
  edit: "在 GitHub 上编辑",
@@ -20,6 +21,7 @@ export const zh: UIStringsOverride = {
20
21
  generating: "生成中…",
21
22
  openIn: "在 {name} 中打开",
22
23
  openInChat: "在聊天中打开",
24
+ openInChatPrompt: "请阅读 {url} 以便我就此页面提问。",
23
25
  scrollToTop: "回到顶部",
24
26
  },
25
27
  ask: {
@@ -7,7 +7,7 @@ import { stripBasePath } from "./base-path.ts";
7
7
  import { writeTextAtomic } from "./fs-atomic.ts";
8
8
  import { localizeRoute } from "./i18n.ts";
9
9
  import type { BlumeProject } from "./project-graph.ts";
10
- import { scanProject } from "./project-graph.ts";
10
+ import { isWithin, scanProject } from "./project-graph.ts";
11
11
  import { VERSION_ID } from "./schema.ts";
12
12
  import { nextFenceState } from "./sources/normalize.ts";
13
13
  import type { FenceState } from "./sources/normalize.ts";
@@ -60,11 +60,16 @@ const buildRouteRewrites = (
60
60
  const { contentRoot } = project.context;
61
61
  const rewrites = new Map<string, string>();
62
62
  for (const page of project.graph.pages) {
63
- // `sourcePath` is set by the filesystem adapter only, so its absence
64
- // already excludes generated and remote pages.
63
+ // `sourcePath` marks a page backed by a local file, which excludes
64
+ // generated and remote pages; the content-root check below excludes local
65
+ // files that live outside the tree a version snapshot copies. A staged
66
+ // page (an Obsidian note) is served from its source, not from the copied
67
+ // tree, so it keeps publishing as current even when its file sits under
68
+ // the content root.
65
69
  const { sourcePath } = page;
66
70
  if (
67
71
  page.version !== "" ||
72
+ page.collection === "staged" ||
68
73
  !sourcePath ||
69
74
  relative(contentRoot, sourcePath).startsWith("..")
70
75
  ) {
@@ -172,12 +177,14 @@ export const insertArchivedVersion = async (
172
177
  const indent = text.slice(lineStart).match(/^\s*/u)?.[0] ?? "";
173
178
  const rest = text.slice(insertAt);
174
179
  // Match the array's authored shape: empty stays bare, an inline array gets
175
- // an inline entry, a multiline array gets its own indented line.
180
+ // an inline entry, a multiline array gets its own indented line — on the
181
+ // file's own line ending, so a CRLF config doesn't gain a lone LF.
182
+ const eol = /^\r?\n/u.exec(rest)?.[0];
176
183
  let entry: string;
177
184
  if (rest.trimStart().startsWith("]")) {
178
185
  entry = `{ id: "${id}" }`;
179
- } else if (rest.startsWith("\n")) {
180
- entry = `\n${indent} { id: "${id}" },`;
186
+ } else if (eol) {
187
+ entry = `${eol}${indent} { id: "${id}" },`;
181
188
  } else {
182
189
  entry = `{ id: "${id}" }, `;
183
190
  }
@@ -240,6 +247,18 @@ export const cutVersion = async (
240
247
  "node_modules",
241
248
  ...(project.config.versions?.archived.map((version) => version.id) ?? []),
242
249
  ]);
250
+ // Another local source's tree under the content root — an Obsidian vault the
251
+ // filesystem source excludes — is that source's to publish. Copying it would
252
+ // republish its raw notes (wikilinks and `%%comments%%` intact) as
253
+ // filesystem pages of the snapshot, while the source itself keeps serving
254
+ // them as current.
255
+ const foreignRoots = project.sources
256
+ .flatMap((source) =>
257
+ source.staged && source.contentRoot ? [source.contentRoot] : []
258
+ )
259
+ .filter((tree) => isWithin(contentRoot, tree));
260
+ const isForeign = (path: string): boolean =>
261
+ foreignRoots.some((tree) => isWithin(tree, path));
243
262
  const entries = await readdir(contentRoot, { withFileTypes: true });
244
263
  let copied = 0;
245
264
  await Promise.all(
@@ -252,6 +271,7 @@ export const cutVersion = async (
252
271
  return;
253
272
  }
254
273
  await cp(join(contentRoot, entry.name), join(dir, entry.name), {
274
+ filter: (source) => !isForeign(source),
255
275
  recursive: true,
256
276
  });
257
277
  })
@@ -0,0 +1,26 @@
1
+ import {
2
+ binaryTag,
3
+ CORE_SCHEMA,
4
+ mergeTag,
5
+ omapTag,
6
+ pairsTag,
7
+ setTag,
8
+ timestampTag,
9
+ } from "js-yaml";
10
+
11
+ /**
12
+ * The schema js-yaml 4 loaded with by default: YAML 1.2 core scalars plus the
13
+ * `!!timestamp`, `!!merge`, `!!binary`, `!!omap`, `!!pairs`, and `!!set` tags.
14
+ * js-yaml 5 loads with the bare core schema instead, which turns
15
+ * `date: 2024-01-01` into a string and leaves `<<:` merge keys unresolved — a
16
+ * silent change to every page's front matter. Every Blume `load` call passes
17
+ * this schema so parsing stays identical across the upgrade.
18
+ */
19
+ export const YAML_SCHEMA = CORE_SCHEMA.withTags(
20
+ timestampTag,
21
+ mergeTag,
22
+ binaryTag,
23
+ omapTag,
24
+ pairsTag,
25
+ setTag
26
+ );