blume 1.7.3 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +19 -0
- package/CHANGELOG.md +217 -0
- package/README.md +34 -21
- package/dist/cli/chunk-11j0384y.js +148 -0
- package/dist/cli/chunk-11j0384y.js.map +10 -0
- package/dist/cli/{chunk-rqy0s5wh.js → chunk-1w8dp3qb.js} +17 -16
- package/dist/cli/{chunk-rqy0s5wh.js.map → chunk-1w8dp3qb.js.map} +3 -3
- package/dist/cli/chunk-2q1dwty4.js +75 -0
- package/dist/cli/chunk-2q1dwty4.js.map +11 -0
- package/dist/cli/chunk-41za066z.js +122 -0
- package/dist/cli/chunk-41za066z.js.map +11 -0
- package/dist/cli/chunk-5a2z0198.js +133 -0
- package/dist/cli/chunk-5a2z0198.js.map +10 -0
- package/dist/cli/{chunk-5g0w1e2c.js → chunk-6k8vp3ta.js} +25 -13
- package/dist/cli/{chunk-5g0w1e2c.js.map → chunk-6k8vp3ta.js.map} +4 -4
- package/dist/cli/{chunk-5qk08vmp.js → chunk-79njf86q.js} +133 -54
- package/dist/cli/chunk-79njf86q.js.map +11 -0
- package/dist/cli/{chunk-e7f42gdj.js → chunk-7ez8ny0t.js} +2 -2
- package/dist/cli/{chunk-nn13znc2.js → chunk-88cpgt6h.js} +1 -1
- package/dist/cli/chunk-a9kptbw5.js +361 -0
- package/dist/cli/chunk-a9kptbw5.js.map +14 -0
- package/dist/cli/chunk-abh8yjkn.js +31 -0
- package/dist/cli/chunk-abh8yjkn.js.map +10 -0
- package/dist/cli/chunk-b5aj94ah.js +91 -0
- package/dist/cli/chunk-b5aj94ah.js.map +10 -0
- package/dist/cli/{chunk-b27xqwn9.js → chunk-bctazmbk.js} +9 -5
- package/dist/cli/chunk-bctazmbk.js.map +10 -0
- package/dist/cli/chunk-beat36xx.js +279 -0
- package/dist/cli/chunk-beat36xx.js.map +10 -0
- package/dist/cli/chunk-bnbmcwfb.js +145 -0
- package/dist/cli/chunk-bnbmcwfb.js.map +11 -0
- package/dist/cli/{chunk-0xjyb285.js → chunk-bw22s759.js} +15 -5
- package/dist/cli/{chunk-0xjyb285.js.map → chunk-bw22s759.js.map} +4 -4
- package/dist/cli/chunk-by2290sx.js +39 -0
- package/dist/cli/chunk-by2290sx.js.map +10 -0
- package/dist/cli/chunk-d1tadaw7.js +79 -0
- package/dist/cli/chunk-d1tadaw7.js.map +10 -0
- package/dist/cli/{chunk-ahnw3kxw.js → chunk-d80hr03s.js} +24 -19
- package/dist/cli/chunk-d80hr03s.js.map +15 -0
- package/dist/cli/chunk-ernrthtr.js +97 -0
- package/dist/cli/chunk-ernrthtr.js.map +10 -0
- package/dist/cli/chunk-f2972sbt.js +374 -0
- package/dist/cli/chunk-f2972sbt.js.map +10 -0
- package/dist/cli/{chunk-vacwm2hv.js → chunk-f7t03s3g.js} +2 -2
- package/dist/cli/{chunk-2z47ypj8.js → chunk-fa25z98p.js} +16 -3
- package/dist/cli/chunk-fa25z98p.js.map +11 -0
- package/dist/cli/{chunk-cjtn640a.js → chunk-fh5hj5jt.js} +43 -20
- package/dist/cli/chunk-fh5hj5jt.js.map +10 -0
- package/dist/cli/{chunk-yg63d42r.js → chunk-j8mw0za6.js} +86 -57
- package/dist/cli/chunk-j8mw0za6.js.map +35 -0
- package/dist/cli/{chunk-ct47dqpx.js → chunk-jts8mvcz.js} +67 -7
- package/dist/cli/{chunk-2mzebbbz.js.map → chunk-jts8mvcz.js.map} +6 -4
- package/dist/cli/{chunk-ps4m1xh4.js → chunk-mnqj32sj.js} +505 -542
- package/dist/cli/chunk-mnqj32sj.js.map +12 -0
- package/dist/cli/{chunk-8cjtbafj.js → chunk-mwt1k8n7.js} +100 -374
- package/dist/cli/chunk-mwt1k8n7.js.map +10 -0
- package/dist/cli/chunk-nk3ts2xk.js +51 -0
- package/dist/cli/chunk-nk3ts2xk.js.map +10 -0
- package/dist/cli/{chunk-3r45185y.js → chunk-pat2zzwc.js} +9 -11
- package/dist/cli/{chunk-3r45185y.js.map → chunk-pat2zzwc.js.map} +2 -2
- package/dist/cli/chunk-pnnvybbk.js +176 -0
- package/dist/cli/chunk-pnnvybbk.js.map +11 -0
- package/dist/cli/{chunk-4x36ddpw.js → chunk-sqn5t4q0.js} +81 -87
- package/dist/cli/chunk-sqn5t4q0.js.map +10 -0
- package/dist/cli/{chunk-bvwwhd84.js → chunk-tzne8qfq.js} +15 -15
- package/dist/cli/{chunk-bvwwhd84.js.map → chunk-tzne8qfq.js.map} +1 -1
- package/dist/cli/chunk-xaz13gwg.js +12449 -0
- package/dist/cli/chunk-xaz13gwg.js.map +182 -0
- package/dist/cli/chunk-y3e45rc8.js +102 -0
- package/dist/cli/chunk-y3e45rc8.js.map +10 -0
- package/dist/cli/chunk-z01ze5c1.js +261 -0
- package/dist/cli/chunk-z01ze5c1.js.map +10 -0
- package/dist/cli/{chunk-k79xp7av.js → chunk-z1f5arsg.js} +219 -689
- package/dist/cli/chunk-z1f5arsg.js.map +36 -0
- package/dist/cli/{chunk-1jefwnfs.js → chunk-zg2gtj10.js} +1076 -2592
- package/dist/cli/chunk-zg2gtj10.js.map +35 -0
- package/dist/cli/{chunk-dwgcp5sm.js → chunk-zxccj738.js} +1 -1
- package/dist/cli/index.js +214 -57
- package/dist/cli/index.js.map +8 -7
- package/dist/types/ai/agent-readability.d.ts +52 -0
- package/dist/types/ai/ai-catalog.d.ts +42 -0
- package/dist/types/ai/api/paths.d.ts +17 -0
- package/dist/types/ai/api-catalog.d.ts +18 -0
- package/dist/types/ai/ask.d.ts +368 -0
- package/dist/types/ai/changelog-markdown.d.ts +2 -0
- package/dist/types/ai/component-markdown.d.ts +2 -2
- package/dist/types/ai/index.d.ts +24 -0
- package/dist/types/ai/link-headers.d.ts +24 -0
- package/dist/types/ai/llms.d.ts +25 -0
- package/dist/types/ai/markdown.d.ts +45 -0
- package/dist/types/ai/mcp/discovery.d.ts +68 -0
- package/dist/types/ai/mcp/tools.d.ts +16 -0
- package/dist/types/ai/openapi-components.d.ts +43 -0
- package/dist/types/ai/relative-links.d.ts +26 -0
- package/dist/types/ai/serializers.d.ts +15 -0
- package/dist/types/ai/skills.d.ts +42 -0
- package/dist/types/ai/tar.d.ts +25 -0
- package/dist/types/ai/visibility.d.ts +17 -0
- package/dist/types/ai/web-bot-auth.d.ts +16 -0
- package/dist/types/analytics/adobe.d.ts +35 -0
- package/dist/types/analytics/amplitude.d.ts +50 -0
- package/dist/types/analytics/clarity.d.ts +31 -0
- package/dist/types/analytics/clearbit.d.ts +29 -0
- package/dist/types/analytics/cloudflare.d.ts +41 -0
- package/dist/types/analytics/fathom.d.ts +41 -0
- package/dist/types/analytics/google-analytics.d.ts +44 -0
- package/dist/types/analytics/google-tag-manager.d.ts +40 -0
- package/dist/types/analytics/head.d.ts +30 -0
- package/dist/types/analytics/heap.d.ts +40 -0
- package/dist/types/analytics/hightouch.d.ts +44 -0
- package/dist/types/analytics/hotjar.d.ts +33 -0
- package/dist/types/analytics/index.d.ts +61 -0
- package/dist/types/analytics/inline.d.ts +17 -0
- package/dist/types/analytics/logrocket.d.ts +44 -0
- package/dist/types/analytics/mixpanel.d.ts +67 -0
- package/dist/types/analytics/pirsch.d.ts +42 -0
- package/dist/types/analytics/plausible.d.ts +56 -0
- package/dist/types/analytics/posthog.d.ts +45 -0
- package/dist/types/analytics/schema.d.ts +320 -0
- package/dist/types/analytics/script.d.ts +46 -0
- package/dist/types/analytics/segment.d.ts +50 -0
- package/dist/types/analytics/vercel.d.ts +48 -0
- package/dist/types/astro/integration.d.ts +76 -0
- package/dist/types/astro/markdown-negotiation.d.ts +23 -0
- package/dist/types/astro/module-types.d.ts +14 -0
- package/dist/types/astro/pages.d.ts +44 -0
- package/dist/types/cli/env.d.ts +12 -0
- package/dist/types/cli/init/scaffold.d.ts +154 -0
- package/dist/types/components/layout/nav-utils.d.ts +11 -0
- package/dist/types/core/adapter.d.ts +47 -0
- package/dist/types/core/api-name.d.ts +7 -0
- package/dist/types/core/changelog-index.d.ts +13 -0
- package/dist/types/core/config-input.d.ts +186 -515
- package/dist/types/core/config.d.ts +60 -34
- package/dist/types/core/content-assets.d.ts +76 -0
- package/dist/types/core/custom-pages.d.ts +33 -0
- package/dist/types/core/data.d.ts +27 -12
- package/dist/types/core/define-components.d.ts +12 -9
- package/dist/types/core/deployment-env.d.ts +6 -11
- package/dist/types/core/frontmatter.d.ts +10 -0
- package/dist/types/core/graph.d.ts +18 -0
- package/dist/types/core/heading-markers.d.ts +54 -0
- package/dist/types/core/i18n-ui.d.ts +6 -2
- package/dist/types/core/i18n.d.ts +87 -0
- package/dist/types/core/includes.d.ts +138 -0
- package/dist/types/core/last-modified.d.ts +47 -0
- package/dist/types/core/links.d.ts +95 -0
- package/dist/types/core/locale-links.d.ts +60 -0
- package/dist/types/core/manifest.d.ts +17 -0
- package/dist/types/core/meta.d.ts +38 -0
- package/dist/types/core/nav-diagnostics.d.ts +26 -0
- package/dist/types/core/navigation.d.ts +6 -0
- package/dist/types/core/node-require.d.ts +19 -0
- package/dist/types/core/package-json.d.ts +13 -0
- package/dist/types/core/probe.d.ts +42 -0
- package/dist/types/core/project-graph.d.ts +51 -0
- package/dist/types/core/project.d.ts +2 -0
- package/dist/types/core/safe-href.d.ts +2 -0
- package/dist/types/core/safe-links.d.ts +26 -0
- package/dist/types/core/schema.d.ts +2282 -452
- package/dist/types/core/site-url.d.ts +16 -0
- package/dist/types/core/sources/assets.d.ts +36 -0
- package/dist/types/core/sources/cache.d.ts +37 -0
- package/dist/types/core/sources/collection.d.ts +28 -0
- package/dist/types/core/sources/contentful-rich-text.d.ts +31 -0
- package/dist/types/core/sources/contentful.d.ts +40 -0
- package/dist/types/core/sources/filesystem.d.ts +24 -0
- package/dist/types/core/sources/github-releases.d.ts +31 -0
- package/dist/types/core/sources/json.d.ts +30 -0
- package/dist/types/core/sources/lexical.d.ts +19 -0
- package/dist/types/core/sources/lower.d.ts +75 -0
- package/dist/types/core/sources/mdx-remote.d.ts +28 -0
- package/dist/types/core/sources/normalize.d.ts +147 -0
- package/dist/types/core/sources/notion.d.ts +131 -0
- package/dist/types/core/sources/obsidian.d.ts +46 -0
- package/dist/types/core/sources/payload.d.ts +39 -0
- package/dist/types/core/sources/portable-text.d.ts +42 -0
- package/dist/types/core/sources/read.d.ts +23 -0
- package/dist/types/core/sources/remote.d.ts +74 -0
- package/dist/types/core/sources/resolve.d.ts +19 -0
- package/dist/types/core/sources/sanity.d.ts +43 -0
- package/dist/types/core/sources/strapi-blocks.d.ts +12 -0
- package/dist/types/core/sources/strapi.d.ts +33 -0
- package/dist/types/core/sources/types.d.ts +7 -0
- package/dist/types/core/sources/watch.d.ts +45 -0
- package/dist/types/core/text-width.d.ts +11 -0
- package/dist/types/core/types.d.ts +15 -1
- package/dist/types/core/unrecognized-keys.d.ts +7 -0
- package/dist/types/core/versions.d.ts +72 -0
- package/dist/types/core/yaml.d.ts +9 -0
- package/dist/types/deploy/adapter-output.d.ts +45 -0
- package/dist/types/deploy/adapters/cloudflare.d.ts +40 -0
- package/dist/types/deploy/adapters/index.d.ts +29 -0
- package/dist/types/deploy/adapters/netlify.d.ts +37 -0
- package/dist/types/deploy/adapters/node.d.ts +37 -0
- package/dist/types/deploy/adapters/registry.d.ts +133 -0
- package/dist/types/deploy/adapters/types.d.ts +71 -0
- package/dist/types/deploy/adapters/vercel.d.ts +38 -0
- package/dist/types/deploy/artifacts.d.ts +65 -0
- package/dist/types/deploy/cloudflare-negotiation.d.ts +196 -0
- package/dist/types/deploy/function-bundle.d.ts +80 -0
- package/dist/types/deploy/headers.d.ts +50 -0
- package/dist/types/deploy/node-headers.d.ts +42 -0
- package/dist/types/deploy/platforms/cloudflare.d.ts +40 -0
- package/dist/types/deploy/platforms/index.d.ts +18 -0
- package/dist/types/deploy/platforms/netlify.d.ts +13 -0
- package/dist/types/deploy/platforms/node.d.ts +11 -0
- package/dist/types/deploy/platforms/paths.d.ts +27 -0
- package/dist/types/deploy/platforms/static.d.ts +10 -0
- package/dist/types/deploy/platforms/types.d.ts +104 -0
- package/dist/types/deploy/platforms/vercel.d.ts +32 -0
- package/dist/types/deploy/redirects.d.ts +53 -0
- package/dist/types/deploy/robots.d.ts +8 -0
- package/dist/types/deploy/rss.d.ts +31 -0
- package/dist/types/deploy/sitemap.d.ts +21 -0
- package/dist/types/deploy/vercel-negotiation.d.ts +109 -0
- package/dist/types/markdown/code-title.d.ts +32 -0
- package/dist/types/markdown/fence-meta.d.ts +23 -0
- package/dist/types/markdown/themes.d.ts +3 -3
- package/dist/types/openapi/asyncapi.d.ts +129 -0
- package/dist/types/openapi/graphql-build.d.ts +8 -0
- package/dist/types/openapi/graphql.d.ts +122 -0
- package/dist/types/openapi/model.d.ts +158 -0
- package/dist/types/openapi/parse.d.ts +57 -0
- package/dist/types/openapi/references.d.ts +37 -25
- package/dist/types/openapi/render-mdx.d.ts +33 -0
- package/dist/types/openapi/sentence.d.ts +7 -0
- package/dist/types/openapi/signature.d.ts +10 -0
- package/dist/types/openapi/source.d.ts +22 -0
- package/dist/types/openapi/spec-dependency-error.d.ts +10 -0
- package/dist/types/reference/asyncapi.d.ts +166 -0
- package/dist/types/reference/graphql.d.ts +181 -0
- package/dist/types/reference/index.d.ts +32 -0
- package/dist/types/reference/openapi.d.ts +165 -0
- package/dist/types/reference/options.d.ts +157 -0
- package/dist/types/reference/scalar.d.ts +136 -0
- package/dist/types/reference/schema.d.ts +630 -0
- package/dist/types/search/adapters/algolia.d.ts +32 -0
- package/dist/types/search/adapters/flexsearch.d.ts +12 -0
- package/dist/types/search/adapters/index.d.ts +31 -0
- package/dist/types/search/adapters/mixedbread.d.ts +22 -0
- package/dist/types/search/adapters/orama-cloud.d.ts +33 -0
- package/dist/types/search/adapters/orama.d.ts +13 -0
- package/dist/types/search/adapters/pagefind.d.ts +12 -0
- package/dist/types/search/adapters/registry.d.ts +228 -0
- package/dist/types/search/adapters/types.d.ts +34 -0
- package/dist/types/search/adapters/typesense.d.ts +42 -0
- package/dist/types/search/build.d.ts +23 -0
- package/dist/types/search/documents.d.ts +90 -0
- package/dist/types/search/facets.d.ts +3 -0
- package/dist/types/search/sync/algolia.d.ts +14 -0
- package/dist/types/search/sync/index.d.ts +14 -0
- package/dist/types/search/sync/orama-cloud.d.ts +10 -0
- package/dist/types/search/sync/typesense.d.ts +14 -0
- package/dist/types/sources/contentful.d.ts +68 -0
- package/dist/types/sources/custom.d.ts +20 -0
- package/dist/types/sources/filesystem.d.ts +42 -0
- package/dist/types/sources/github-releases.d.ts +46 -0
- package/dist/types/sources/index.d.ts +48 -0
- package/dist/types/sources/mdx-remote.d.ts +63 -0
- package/dist/types/sources/notion.d.ts +65 -0
- package/dist/types/sources/obsidian.d.ts +34 -0
- package/dist/types/sources/payload.d.ts +68 -0
- package/dist/types/sources/registry.d.ts +1414 -0
- package/dist/types/sources/sanity.d.ts +69 -0
- package/dist/types/sources/shared.d.ts +46 -0
- package/dist/types/sources/strapi.d.ts +66 -0
- package/dist/types/theme/icon-kind.d.ts +11 -0
- package/dist/types/theme/icons.d.ts +20 -0
- package/docs/01-quickstart.mdx +18 -18
- package/docs/02-deployment.mdx +50 -26
- package/docs/03-upgrading.mdx +351 -0
- package/docs/04-migrating.mdx +58 -0
- package/docs/08-faq.mdx +3 -3
- package/docs/advanced/blog.mdx +13 -6
- package/docs/advanced/changelog.mdx +23 -35
- package/docs/advanced/custom-pages.mdx +20 -8
- package/docs/advanced/meta.ts +1 -8
- package/docs/advanced/skills.mdx +8 -0
- package/docs/cli/audit.mdx +646 -0
- package/docs/cli/doctor.mdx +29 -0
- package/docs/{reference/eval.mdx → cli/evals.mdx} +9 -8
- package/docs/cli/index.mdx +105 -0
- package/docs/cli/meta.ts +7 -0
- package/docs/{reference → cli}/translate.mdx +1 -1
- package/docs/cli/validate.mdx +41 -0
- package/docs/cli/version.mdx +40 -0
- package/docs/configuration/analytics.mdx +350 -59
- package/docs/configuration/ask-ai.mdx +162 -61
- package/docs/configuration/customization.mdx +15 -9
- package/docs/configuration/index.mdx +50 -31
- package/docs/configuration/search.mdx +75 -54
- package/docs/configuration/theming.mdx +24 -15
- package/docs/content/components.mdx +21 -5
- package/docs/{reference → content}/frontmatter.mdx +35 -1
- package/docs/content/i18n.mdx +8 -6
- package/docs/content/includes.mdx +2 -4
- package/docs/content/index.mdx +1 -1
- package/docs/content/islands.mdx +10 -5
- package/docs/content/meta.mdx +1 -1
- package/docs/content/meta.ts +1 -0
- package/docs/content/navigation.mdx +9 -7
- package/docs/content/sources.mdx +145 -50
- package/docs/content/syntax.mdx +16 -12
- package/docs/content/versioning.mdx +3 -3
- package/docs/discoverability/agent-discovery.mdx +11 -11
- package/docs/discoverability/index.mdx +4 -4
- package/docs/discoverability/json-api.mdx +4 -4
- package/docs/discoverability/llms-txt.mdx +6 -6
- package/docs/discoverability/markdown.mdx +4 -4
- package/docs/discoverability/mcp.mdx +11 -11
- package/docs/discoverability/sitemap-and-robots.mdx +3 -3
- package/docs/index.mdx +2 -2
- package/docs/references/asyncapi.mdx +59 -0
- package/docs/{advanced → references}/graphql.mdx +45 -32
- package/docs/{reference → references}/meta.ts +2 -2
- package/docs/references/openapi.mdx +171 -0
- package/docs/references/scalar.mdx +64 -0
- package/package.json +42 -8
- package/skills/blume/SKILL.md +21 -8
- package/skills/blume-migrate/SKILL.md +22 -21
- package/skills/blume-migrate/assets/oxfmt@0.67.0.patch +49 -0
- package/skills/blume-migrate/references/docusaurus.md +5 -4
- package/skills/blume-migrate/references/fumadocs.md +4 -4
- package/skills/blume-migrate/references/mintlify.md +23 -8
- package/skills/blume-migrate/references/monorepo.md +6 -6
- package/skills/blume-migrate/references/starlight.md +4 -4
- package/src/ai/agent-readability.ts +21 -22
- package/src/ai/ai-catalog.ts +50 -32
- package/src/ai/api/handlers.ts +46 -11
- package/src/ai/api-catalog.ts +8 -8
- package/src/ai/ask-data.ts +1 -1
- package/src/ai/ask.ts +624 -100
- package/src/ai/changelog-markdown.ts +91 -0
- package/src/ai/component-markdown.ts +328 -12
- package/src/ai/index.ts +45 -0
- package/src/ai/link-headers.ts +7 -6
- package/src/ai/llms.ts +20 -15
- package/src/ai/markdown.ts +35 -5
- package/src/ai/mcp/data.ts +9 -5
- package/src/ai/openapi-components.ts +4 -1
- package/src/ai/relative-links.ts +170 -0
- package/src/ai/serializers.ts +2 -2
- package/src/ai/skills.ts +1 -1
- package/src/ai/web-bot-auth.ts +2 -2
- package/src/analytics/adobe.ts +46 -0
- package/src/analytics/amplitude.ts +79 -0
- package/src/analytics/clarity.ts +46 -0
- package/src/analytics/clearbit.ts +47 -0
- package/src/analytics/cloudflare.ts +67 -0
- package/src/analytics/fathom.ts +64 -0
- package/src/analytics/google-analytics.ts +84 -0
- package/src/analytics/google-tag-manager.ts +61 -0
- package/src/analytics/head.ts +130 -0
- package/src/analytics/heap.ts +65 -0
- package/src/analytics/hightouch.ts +77 -0
- package/src/analytics/hotjar.ts +47 -0
- package/src/analytics/index.ts +71 -0
- package/src/analytics/inline.ts +21 -0
- package/src/analytics/logrocket.ts +71 -0
- package/src/analytics/mixpanel.ts +92 -0
- package/src/analytics/pirsch.ts +66 -0
- package/src/analytics/plausible.ts +83 -0
- package/src/analytics/posthog.ts +78 -0
- package/src/analytics/schema.ts +60 -0
- package/src/analytics/script.ts +60 -0
- package/src/analytics/segment.ts +85 -0
- package/src/analytics/vercel.ts +50 -0
- package/src/astro/adapter-root.ts +7 -9
- package/src/astro/component-slots.ts +131 -91
- package/src/astro/generate.ts +112 -345
- package/src/astro/integration.ts +2 -6
- package/src/astro/pages.ts +13 -101
- package/src/astro/render-deps.ts +379 -0
- package/src/astro/runtime-deps.ts +201 -0
- package/src/astro/templates.ts +554 -541
- package/src/audit/agent.ts +24 -0
- package/src/audit/catalog.ts +2 -2
- package/src/audit/checks/assets.ts +2 -2
- package/src/audit/checks/dns-aid.ts +1 -1
- package/src/audit/checks/duplicates.ts +3 -1
- package/src/audit/checks/i18n.ts +1 -1
- package/src/audit/checks/indexability.ts +7 -7
- package/src/audit/checks/links.ts +2 -2
- package/src/audit/checks/llms.ts +6 -6
- package/src/audit/checks/network.ts +3 -3
- package/src/audit/checks/og-image.ts +2 -2
- package/src/audit/checks/robots.ts +1 -1
- package/src/audit/checks/sitemap.ts +2 -2
- package/src/audit/checks/social.ts +1 -1
- package/src/audit/run.ts +4 -3
- package/src/audit/terms.ts +31 -0
- package/src/audit/url.ts +13 -13
- package/src/cli/command-meta.ts +10 -0
- package/src/cli/commands/audit.ts +39 -20
- package/src/cli/commands/build.ts +71 -316
- package/src/cli/commands/check.ts +1 -0
- package/src/cli/commands/dev.ts +40 -1
- package/src/cli/commands/doctor.ts +90 -14
- package/src/cli/commands/eject.ts +44 -7
- package/src/cli/commands/eval.ts +2 -2
- package/src/cli/commands/init.ts +161 -41
- package/src/cli/commands/migrate.ts +121 -0
- package/src/cli/commands/preview.ts +7 -1
- package/src/cli/commands/translate.ts +2 -2
- package/src/cli/commands/upgrade.ts +141 -0
- package/src/cli/commands/version.ts +57 -44
- package/src/cli/eject-scripts.ts +121 -6
- package/src/cli/index.ts +11 -1
- package/src/cli/init/install.ts +70 -0
- package/src/cli/init/questions.ts +7 -0
- package/src/cli/init/scaffold.ts +459 -75
- package/src/cli/lazy-command.ts +37 -1
- package/src/cli/prepare.ts +40 -6
- package/src/cli/required-secrets.ts +38 -11
- package/src/cli/unknown-flags.ts +266 -0
- package/src/cli/yarn-pnp.ts +52 -0
- package/src/components/content/AccordionItem.astro +7 -1
- package/src/components/content/Card.astro +4 -3
- package/src/components/content/ColorItem.astro +22 -4
- package/src/components/content/GithubInfo.astro +2 -2
- package/src/components/content/Prompt.astro +25 -25
- package/src/components/content/Tabs.astro +3 -1
- package/src/components/content/Tile.astro +2 -3
- package/src/components/content/Tooltip.astro +57 -9
- package/src/components/content/content-strings.ts +34 -0
- package/src/components/content/diff.ts +1 -1
- package/src/components/content/mermaid-element.ts +13 -2
- package/src/components/content/prompt-markdown.ts +292 -0
- package/src/components/content/tooltip-id.ts +41 -0
- package/src/components/islands/hooks.ts +25 -2
- package/src/components/layout/Analytics.astro +21 -79
- package/src/components/layout/Banner.astro +3 -1
- package/src/components/layout/DiscoveryLinks.astro +69 -0
- package/src/components/layout/Header.astro +83 -20
- package/src/components/layout/LanguageSwitcher.astro +4 -1
- package/src/components/layout/Logo.astro +23 -2
- package/src/components/layout/NavSelector.astro +13 -2
- package/src/components/layout/NavTree.astro +12 -3
- package/src/components/layout/NavTreeScript.astro +17 -3
- package/src/components/layout/PageActions.astro +3 -3
- package/src/components/layout/PageFeedback.astro +11 -1
- package/src/components/layout/PageLayout.astro +52 -5
- package/src/components/layout/ReferenceLayout.astro +21 -12
- package/src/components/layout/RootLayout.astro +69 -66
- package/src/components/layout/Search.astro +30 -6
- package/src/components/layout/WebMcp.astro +1 -1
- package/src/components/layout/analytics-client.ts +72 -15
- package/src/components/layout/drawer-inert.ts +113 -15
- package/src/components/layout/dropdown-clamp.ts +105 -0
- package/src/components/layout/head-scripts.ts +15 -6
- package/src/components/layout/nav-utils.ts +17 -0
- package/src/components/layout/search/algolia.ts +8 -8
- package/src/components/layout/search/orama-cloud.ts +9 -7
- package/src/components/layout/search/typesense.ts +11 -17
- package/src/components/openapi/MessageComposer.astro +2 -2
- package/src/components/openapi/Playground.astro +2 -2
- package/src/components/openapi/playground-client.ts +79 -10
- package/src/core/changelog-index.ts +24 -0
- package/src/core/component-overrides.ts +399 -154
- package/src/core/config-input.ts +188 -553
- package/src/core/config.ts +130 -41
- package/src/core/custom-pages.ts +105 -0
- package/src/core/data.ts +31 -12
- package/src/core/define-components.ts +12 -9
- package/src/core/deployment-env.ts +18 -74
- package/src/core/diagnostics.ts +14 -7
- package/src/core/graph.ts +69 -25
- package/src/core/i18n-ui.ts +6 -2
- package/src/core/i18n.ts +17 -0
- package/src/core/includes.ts +156 -38
- package/src/core/last-modified.ts +6 -11
- package/src/core/links.ts +166 -2
- package/src/core/manifest.ts +10 -3
- package/src/core/navigation.ts +115 -16
- package/src/core/new-tab.ts +35 -0
- package/src/core/node-require.ts +21 -0
- package/src/core/project-graph.ts +42 -26
- package/src/core/project.ts +9 -4
- package/src/core/request-body.ts +61 -0
- package/src/core/safe-href.ts +28 -0
- package/src/core/safe-links.ts +68 -0
- package/src/core/schema.ts +517 -739
- package/src/core/server-features.ts +8 -9
- package/src/core/sources/assets.ts +47 -11
- package/src/core/sources/collection.ts +67 -0
- package/src/core/sources/contentful-rich-text.ts +285 -0
- package/src/core/sources/contentful.ts +173 -0
- package/src/core/sources/github-releases.ts +51 -1
- package/src/core/sources/json.ts +71 -0
- package/src/core/sources/lexical.ts +195 -0
- package/src/core/sources/lower.ts +226 -0
- package/src/core/sources/normalize.ts +52 -2
- package/src/core/sources/notion.ts +39 -28
- package/src/core/sources/payload.ts +135 -0
- package/src/core/sources/portable-text.ts +11 -16
- package/src/core/sources/remote.ts +226 -0
- package/src/core/sources/resolve.ts +104 -166
- package/src/core/sources/sanity.ts +16 -49
- package/src/core/sources/strapi-blocks.ts +124 -0
- package/src/core/sources/strapi.ts +191 -0
- package/src/core/sources/types.ts +12 -1
- package/src/core/types.ts +15 -1
- package/src/core/ui-packs/ar.ts +6 -2
- package/src/core/ui-packs/bg.ts +6 -2
- package/src/core/ui-packs/bn.ts +6 -2
- package/src/core/ui-packs/ca.ts +3 -1
- package/src/core/ui-packs/cs.ts +6 -2
- package/src/core/ui-packs/da.ts +6 -2
- package/src/core/ui-packs/de.ts +6 -2
- package/src/core/ui-packs/el.ts +3 -1
- package/src/core/ui-packs/es.ts +3 -1
- package/src/core/ui-packs/fa.ts +6 -2
- package/src/core/ui-packs/fi.ts +6 -2
- package/src/core/ui-packs/fr.ts +3 -1
- package/src/core/ui-packs/he.ts +6 -2
- package/src/core/ui-packs/hi.ts +6 -2
- package/src/core/ui-packs/hr.ts +6 -2
- package/src/core/ui-packs/hu.ts +6 -2
- package/src/core/ui-packs/id.ts +6 -2
- package/src/core/ui-packs/it.ts +3 -1
- package/src/core/ui-packs/ja.ts +3 -1
- package/src/core/ui-packs/ko.ts +3 -1
- package/src/core/ui-packs/nl.ts +6 -2
- package/src/core/ui-packs/no.ts +6 -2
- package/src/core/ui-packs/pl.ts +6 -2
- package/src/core/ui-packs/pt-br.ts +3 -1
- package/src/core/ui-packs/pt.ts +3 -1
- package/src/core/ui-packs/ro.ts +6 -2
- package/src/core/ui-packs/ru.ts +6 -2
- package/src/core/ui-packs/sk.ts +6 -2
- package/src/core/ui-packs/sr.ts +6 -2
- package/src/core/ui-packs/sv.ts +6 -2
- package/src/core/ui-packs/th.ts +3 -1
- package/src/core/ui-packs/tr.ts +6 -2
- package/src/core/ui-packs/uk.ts +6 -2
- package/src/core/ui-packs/vi.ts +3 -1
- package/src/core/ui-packs/zh-tw.ts +3 -1
- package/src/core/ui-packs/zh.ts +3 -1
- package/src/core/unrecognized-keys.ts +10 -0
- package/src/core/version-cut.ts +116 -8
- package/src/deploy/adapter-output.ts +57 -97
- package/src/deploy/adapters/cloudflare.ts +39 -0
- package/src/deploy/adapters/index.ts +41 -0
- package/src/deploy/adapters/netlify.ts +34 -0
- package/src/deploy/adapters/node.ts +34 -0
- package/src/deploy/adapters/registry.ts +127 -0
- package/src/deploy/adapters/types.ts +92 -0
- package/src/deploy/adapters/vercel.ts +35 -0
- package/src/deploy/artifacts.ts +55 -27
- package/src/deploy/cloudflare-negotiation.ts +179 -100
- package/src/deploy/function-bundle.ts +18 -3
- package/src/deploy/headers.ts +124 -23
- package/src/deploy/node-headers.ts +198 -0
- package/src/deploy/platforms/cloudflare.ts +312 -0
- package/src/deploy/platforms/index.ts +67 -0
- package/src/deploy/platforms/netlify.ts +52 -0
- package/src/deploy/platforms/node.ts +40 -0
- package/src/deploy/platforms/paths.ts +42 -0
- package/src/deploy/platforms/static.ts +29 -0
- package/src/deploy/platforms/types.ts +112 -0
- package/src/deploy/platforms/vercel.ts +193 -0
- package/src/deploy/redirects.ts +30 -18
- package/src/deploy/robots.ts +3 -3
- package/src/deploy/rss.ts +2 -2
- package/src/deploy/sitemap.ts +2 -2
- package/src/deploy/vercel-negotiation.ts +2 -2
- package/src/eval/agents.ts +32 -1
- package/src/eval/findings.ts +19 -11
- package/src/eval/report.ts +10 -2
- package/src/markdown/external-links.ts +65 -0
- package/src/markdown/include.ts +45 -27
- package/src/markdown/index.ts +34 -9
- package/src/markdown/inline-code.ts +12 -6
- package/src/markdown/relative-links.ts +324 -0
- package/src/markdown/themes.ts +3 -3
- package/src/migrate/migrate.ts +149 -0
- package/src/openapi/parse.ts +64 -16
- package/src/openapi/proxy.ts +62 -10
- package/src/openapi/references.ts +147 -147
- package/src/openapi/render-mdx.ts +32 -10
- package/src/openapi/scalar.ts +15 -13
- package/src/openapi/sentence.ts +14 -0
- package/src/openapi/source.ts +37 -21
- package/src/openapi/spec-dependency-error.ts +15 -0
- package/src/reference/asyncapi.ts +83 -0
- package/src/reference/graphql.ts +89 -0
- package/src/reference/index.ts +40 -0
- package/src/reference/openapi.ts +83 -0
- package/src/reference/options.ts +201 -0
- package/src/reference/scalar.ts +136 -0
- package/src/reference/schema.ts +88 -0
- package/src/registry/eject.ts +97 -42
- package/src/search/adapters/algolia.ts +46 -0
- package/src/search/adapters/flexsearch.ts +29 -0
- package/src/search/adapters/index.ts +39 -0
- package/src/search/adapters/mixedbread.ts +39 -0
- package/src/search/adapters/orama-cloud.ts +51 -0
- package/src/search/adapters/orama.ts +24 -0
- package/src/search/adapters/pagefind.ts +27 -0
- package/src/search/adapters/registry.ts +131 -0
- package/src/search/adapters/types.ts +46 -0
- package/src/search/adapters/typesense.ts +57 -0
- package/src/search/build.ts +8 -4
- package/src/search/documents.ts +6 -0
- package/src/search/sync/algolia.ts +12 -11
- package/src/search/sync/index.ts +35 -20
- package/src/search/sync/orama-cloud.ts +12 -9
- package/src/search/sync/typesense.ts +15 -13
- package/src/sources/contentful.ts +63 -0
- package/src/sources/custom.ts +38 -0
- package/src/sources/filesystem.ts +51 -0
- package/src/sources/github-releases.ts +52 -0
- package/src/sources/index.ts +60 -0
- package/src/sources/mdx-remote.ts +76 -0
- package/src/sources/notion.ts +63 -0
- package/src/sources/obsidian.ts +38 -0
- package/src/sources/payload.ts +60 -0
- package/src/sources/registry.ts +182 -0
- package/src/sources/sanity.ts +66 -0
- package/src/sources/shared.ts +52 -0
- package/src/sources/strapi.ts +58 -0
- package/src/theme/entry.ts +24 -2
- package/src/translate/report.ts +40 -7
- package/src/upgrade/upgrade.ts +499 -0
- package/dist/cli/chunk-0qymqwzz.js +0 -164
- package/dist/cli/chunk-0qymqwzz.js.map +0 -15
- package/dist/cli/chunk-1jefwnfs.js.map +0 -48
- package/dist/cli/chunk-2mzebbbz.js +0 -69
- package/dist/cli/chunk-2z47ypj8.js.map +0 -11
- package/dist/cli/chunk-4x36ddpw.js.map +0 -11
- package/dist/cli/chunk-5093q3n7.js +0 -68
- package/dist/cli/chunk-5093q3n7.js.map +0 -10
- package/dist/cli/chunk-5qk08vmp.js.map +0 -11
- package/dist/cli/chunk-7s8hm3b6.js +0 -5347
- package/dist/cli/chunk-7s8hm3b6.js.map +0 -58
- package/dist/cli/chunk-8cjtbafj.js.map +0 -13
- package/dist/cli/chunk-97r59kpr.js +0 -381
- package/dist/cli/chunk-97r59kpr.js.map +0 -12
- package/dist/cli/chunk-ahnw3kxw.js.map +0 -15
- package/dist/cli/chunk-b27xqwn9.js.map +0 -10
- package/dist/cli/chunk-bf6bt1xt.js +0 -185
- package/dist/cli/chunk-bf6bt1xt.js.map +0 -11
- package/dist/cli/chunk-cjtn640a.js.map +0 -10
- package/dist/cli/chunk-ct47dqpx.js.map +0 -11
- package/dist/cli/chunk-esphfr8p.js +0 -107
- package/dist/cli/chunk-esphfr8p.js.map +0 -11
- package/dist/cli/chunk-ex56aa81.js +0 -1016
- package/dist/cli/chunk-ex56aa81.js.map +0 -13
- package/dist/cli/chunk-garjf5z9.js +0 -30
- package/dist/cli/chunk-garjf5z9.js.map +0 -10
- package/dist/cli/chunk-js7saxwm.js +0 -1045
- package/dist/cli/chunk-js7saxwm.js.map +0 -22
- package/dist/cli/chunk-k79xp7av.js.map +0 -39
- package/dist/cli/chunk-ps4m1xh4.js.map +0 -15
- package/dist/cli/chunk-q4rae3bg.js +0 -60
- package/dist/cli/chunk-q4rae3bg.js.map +0 -10
- package/dist/cli/chunk-rz9jmfhz.js +0 -108
- package/dist/cli/chunk-rz9jmfhz.js.map +0 -10
- package/dist/cli/chunk-vh9w1sgp.js +0 -73
- package/dist/cli/chunk-vh9w1sgp.js.map +0 -10
- package/dist/cli/chunk-vrfp10qk.js +0 -81
- package/dist/cli/chunk-vrfp10qk.js.map +0 -10
- package/dist/cli/chunk-yg63d42r.js.map +0 -34
- package/docs/advanced/api-reference.mdx +0 -240
- package/docs/reference/cli.mdx +0 -197
- package/skills/blume-migrate/assets/oxfmt@0.55.0.patch +0 -20
- package/src/components/content/changelog-element.ts +0 -69
- package/src/search/providers.ts +0 -91
- /package/dist/cli/{chunk-e7f42gdj.js.map → chunk-7ez8ny0t.js.map} +0 -0
- /package/dist/cli/{chunk-nn13znc2.js.map → chunk-88cpgt6h.js.map} +0 -0
- /package/dist/cli/{chunk-vacwm2hv.js.map → chunk-f7t03s3g.js.map} +0 -0
- /package/dist/cli/{chunk-dwgcp5sm.js.map → chunk-zxccj738.js.map} +0 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
diff --git a/dist/markdown-BMigo7Hm.js b/dist/markdown-BMigo7Hm.js
|
|
2
|
+
index bc9037f6c0de5516b139d8cdb195b1e25cd33bc0..a02c284e28bb535f9964a8a086ebb6549657e416 100644
|
|
3
|
+
--- a/dist/markdown-BMigo7Hm.js
|
|
4
|
+
+++ b/dist/markdown-BMigo7Hm.js
|
|
5
|
+
@@ -4872,7 +4872,43 @@ function lu(e, t, r) {
|
|
6
|
+
case "sentence": return Oh(e, r);
|
|
7
|
+
case "word": return t.parser !== "mdx" ? zh(e, t) : Uh(e);
|
|
8
|
+
case "whitespace": {
|
|
9
|
+
- let { next: a } = e, u = a && /^>|^(?:[*+-]|#{1,6}|\d+[).])$/.test(a.value) && !NE(e) && !(t.proseWrap === "preserve" && RE(e)) ? "never" : t.proseWrap;
|
|
10
|
+
+ let { next: a, previous: oxfmtFencePrev } = e;
|
|
11
|
+
+ // Preserve line breaks that sit directly against a `:::` container
|
|
12
|
+
+ // directive fence, so `proseWrap: "never"` keeps the opening/closing
|
|
13
|
+
+ // fence on their own lines instead of joining them into the prose (which
|
|
14
|
+
+ // breaks the directive). Ordinary prose still wraps per proseWrap.
|
|
15
|
+
+ // See prettier/prettier#19040.
|
|
16
|
+
+ let oxfmtIsFence = (w) => w != null && typeof w.value === "string" && w.value.startsWith(":::");
|
|
17
|
+
+ // A titled directive (`:::warning[Heads up]`) parses its `[title]` as a
|
|
18
|
+
+ // linkReference between two sentence nodes at the paragraph level: the
|
|
19
|
+
+ // fence word ends the sentence before the reference, and the body's
|
|
20
|
+
+ // leading newline opens the sentence after it. So when this whitespace
|
|
21
|
+
+ // starts its sentence, climb to the paragraph and check whether the two
|
|
22
|
+
+ // preceding siblings are a (link) reference and a sentence ending in a
|
|
23
|
+
+ // `:::` fence word.
|
|
24
|
+
+ let oxfmtPrevIsTitledFence = !1;
|
|
25
|
+
+ if (oxfmtFencePrev == null && e.index === 0 && e.grandparent != null && Array.isArray(e.grandparent.children)) {
|
|
26
|
+
+ let oxfmtSibs = e.grandparent.children, oxfmtSentIdx = oxfmtSibs.indexOf(e.parent);
|
|
27
|
+
+ if (oxfmtSentIdx >= 2) {
|
|
28
|
+
+ let oxfmtLink = oxfmtSibs[oxfmtSentIdx - 1], oxfmtBefore = oxfmtSibs[oxfmtSentIdx - 2];
|
|
29
|
+
+ let oxfmtLastWord = oxfmtBefore && oxfmtBefore.type === "sentence" && Array.isArray(oxfmtBefore.children) ? oxfmtBefore.children[oxfmtBefore.children.length - 1] : null;
|
|
30
|
+
+ oxfmtPrevIsTitledFence = oxfmtLink != null && (oxfmtLink.type === "linkReference" || oxfmtLink.type === "link") && oxfmtIsFence(oxfmtLastWord);
|
|
31
|
+
+ }
|
|
32
|
+
+ }
|
|
33
|
+
+ // The plain-markdown parser keeps a titled fence's `[title]` as literal
|
|
34
|
+
+ // words, so the whole directive is one sentence. For a newline
|
|
35
|
+
+ // whitespace, walk back to the start of its visual line within the
|
|
36
|
+
+ // sentence; a line led by a `:::` word is a fence whose break must stay.
|
|
37
|
+
+ if (!oxfmtPrevIsTitledFence && e.node.value.includes("\n") && e.parent != null && Array.isArray(e.parent.children)) {
|
|
38
|
+
+ let oxfmtLineFirst = null;
|
|
39
|
+
+ for (let oxfmtJ = e.index - 1; oxfmtJ >= 0; oxfmtJ--) {
|
|
40
|
+
+ let oxfmtSib = e.parent.children[oxfmtJ];
|
|
41
|
+
+ if (oxfmtSib.type === "whitespace" && typeof oxfmtSib.value === "string" && oxfmtSib.value.includes("\n")) break;
|
|
42
|
+
+ oxfmtLineFirst = oxfmtSib;
|
|
43
|
+
+ }
|
|
44
|
+
+ oxfmtPrevIsTitledFence = oxfmtIsFence(oxfmtLineFirst);
|
|
45
|
+
+ }
|
|
46
|
+
+ let u = oxfmtIsFence(oxfmtFencePrev) || oxfmtPrevIsTitledFence || oxfmtIsFence(a) ? "preserve" : a && /^>|^(?:[*+-]|#{1,6}|\d+[).])$/.test(a.value) && !NE(e) && !(t.proseWrap === "preserve" && RE(e)) ? "never" : t.proseWrap;
|
|
47
|
+
return ou(e, n.value, u, !1, t);
|
|
48
|
+
}
|
|
49
|
+
case "emphasis": {
|
|
@@ -21,18 +21,19 @@ Read `themeConfig`, `presets`, and `plugins`:
|
|
|
21
21
|
| `themeConfig.navbar.items` (external/utility links — Blog, Discord…) | **`navigation.actions`** (`[{ label, href }]`, plain header links) to keep them in the header, or **`navigation.featured`** (`{ label, href, icon? }`, pinned above the sidebar on every route) if they should survive on phones; the GitHub link → the `github` config instead |
|
|
22
22
|
| `themeConfig.navbar.items` (a `className`-styled button — "Get started", "Sign up") | **`navigation.cta`** (`{ label, href }`, the header's one filled button; a route the docs don't serve must be an absolute URL) |
|
|
23
23
|
| `themeConfig.colorMode.defaultMode` | `theme.mode` (`respectPrefersColorScheme: true` → `"system"`) |
|
|
24
|
-
| `themeConfig.prism.theme` / `.darkTheme` | `markdown.
|
|
24
|
+
| `themeConfig.prism.theme` / `.darkTheme` | `markdown.code.theme: { light, dark }` (map Prism theme names to Shiki themes, e.g. `github`/`github-dark`) |
|
|
25
25
|
| `themeConfig.metadata` / `themeConfig.image` | per-page `seo` frontmatter / `seo.og`; report what doesn't fit |
|
|
26
|
-
| `url` + `baseUrl` | **`url` → drop** (`
|
|
26
|
+
| `url` + `baseUrl` | **`url` → drop** (the deployment's `site` is auto-detected); `baseUrl` (when not `/`) → `deployment: { base: "/…" }`, or the `base` option of a host adapter (`vercel({ base })`) when the site also needs one |
|
|
27
27
|
| preset `docs.routeBasePath` — **including the default!** | Docusaurus serves docs at **`/docs/…` by default**; the "map only declared fields" rule does **not** apply here because the _URLs_ are load-bearing. Either keep them with top-level **`basePath: "/docs"`** (invisible to the sidebar), or intentionally move to root and emit a `redirects` entry per page. Decide explicitly and say which. (`routeBasePath: '/'` = docs-only mode — nothing to do.) |
|
|
28
28
|
| preset `docs.editUrl` | `github` (owner/repo/branch; a path after the branch → `github.dir`; **an origin other than `https://github.com` → `github.host`** — a GitHub Enterprise repo's edit links and header mark point at the public site without it) |
|
|
29
29
|
| `themeConfig.footer` | drop → Footer override (`defineComponents` layout slot) |
|
|
30
30
|
| `themeConfig.announcementBar` | `banner` (`{ content, dismissible, id }` — `isCloseable` → `dismissible`; colors drop) |
|
|
31
31
|
| `i18n.locales` / `defaultLocale` | `i18n` — translated files live at `i18n/<locale>/docusaurus-plugin-content-docs/current/…`; move them to `<locale>/…` under `content.root` |
|
|
32
|
-
| `themeConfig.algolia` | drop — Blume ships built-in search (Orama); remove the Algolia dep |
|
|
32
|
+
| `themeConfig.algolia` | drop — Blume ships built-in search (Orama); remove the Algolia dep. To keep the index, `search: algolia({ appId, apiKey, indexName })` from `blume/search` (the DocSearch `apiKey` is the search-only key) |
|
|
33
33
|
| `@docusaurus/plugin-client-redirects` | **static `redirects: [{from, to}]` arrays convert 1:1** to Blume `redirects` (a `from` array = one entry per item); only `createRedirects` functions are truly dynamic → host rules |
|
|
34
34
|
| `@docusaurus/theme-mermaid` | delete the dep — ` ```mermaid ` renders natively (in `.mdx`) |
|
|
35
|
-
|
|
|
35
|
+
| OpenAPI doc plugins (`docusaurus-plugin-openapi-docs`, `redocusaurus`) | delete the plugin **and its generated pages** — add `openapi({ spec })` (from `blume/reference`) to the top-level `reference` list; `redocusaurus` `specs[].route` → the adapter's `route`, one `openapi()` entry (or source) per spec (see SKILL.md "OpenAPI") |
|
|
36
|
+
| GraphQL doc generators (`@graphql-markdown/docusaurus`, `@edno/docusaurus2-graphql-doc-generator`) | delete the plugin **and its generated pages** — add `graphql({ spec, endpoint })` (from `blume/reference`) to the top-level `reference` list instead (see SKILL.md "GraphQL") |
|
|
36
37
|
| `remark-math` + `rehype-katex` | delete — block `$$…$$` renders in `.mdx` with no config (no `markdown.math` field exists); **inline `$…$` is not supported** — convert or drop (report) |
|
|
37
38
|
| Multi-instance docs plugins (`plugin-content-docs` with `id`) | one folder (and usually one `navigation.tabs` entry) per instance |
|
|
38
39
|
|
|
@@ -68,8 +68,8 @@ Fumadocs icons are strings resolved by the repo's own `icon` handler in `loader(
|
|
|
68
68
|
- **File trees:** `<Files>` → **`<Tree>`** (the JSX container for `Tree.*` children — _not_ `<FileTree>`, which wraps a Markdown list); `<Folder>` → `<Tree.Folder>` (`defaultOpen` carries over); `<File>` → `<Tree.File>`. Or convert the whole block to a list-driven `<FileTree>`.
|
|
69
69
|
- **Tabs:** Fumadocs declares labels on the parent (`<Tabs items={['npm','pnpm']}>`) and selects with `<Tab value="npm">`. Blume's `<Tab>` carries its own `title`. Strip `items={[…]}` from `<Tabs>` and give each child `<Tab>` a `title` (from its `value`, or the positional `items` entry).
|
|
70
70
|
- **Pass through unchanged:** `<Steps>`/`<Step>`, `<TypeTable>` (Blume's was modeled on Fumadocs' — identical `type` record shape), `<GithubInfo>`.
|
|
71
|
-
- **`<Banner>`** (layout-mounted, not per-page) → the `banner` config field (`{ content, link, dismissible, id }`).
|
|
72
|
-
- **`<include>./partial.mdx</include>`** — Blume
|
|
71
|
+
- **`<Banner>`** (layout-mounted, not per-page) → the `banner` config field (`{ content, link: { href, text }, dismissible, id }`).
|
|
72
|
+
- **`<include>./partial.mdx</include>`** — Blume uses the same include syntax. **Pass through unchanged**: paths resolve relative to the including file, a leading `/` resolves from the content root, and nested includes work. Keep partials in `_`-prefixed files or folders so they stay out of routing and the sidebar.
|
|
73
73
|
- **No equivalent — report:** `<DynamicCodeBlock>`, `<ImageZoom>` (Blume zooms content images by default), `<InlineTOC>`.
|
|
74
74
|
- **Strip or convert every import** — not just `fumadocs-*`: `lucide-react` imports (icon JSX → string names), `next/image`/`next/link` (→ Markdown image/link), and local components. **Inventory `mdx-components.tsx` before deleting it** — components registered there are used import-free in MDX bodies; port or inline each usage first.
|
|
75
75
|
|
|
@@ -84,11 +84,11 @@ Trailing heading markers — `[#custom-id]` (pinned anchor), `[!toc]` (hide from
|
|
|
84
84
|
|
|
85
85
|
## OpenAPI
|
|
86
86
|
|
|
87
|
-
`fumadocs-openapi` writes **generated MDX stubs into the content tree** (`generateFiles()` output: pages containing `<APIPage>`/`<OpenAPIPage>` with `_openapi` frontmatter), plus `lib/openapi.ts` (`createOpenAPI`) and a generate script. Treat these exactly like Mintlify endpoint stubs: **delete the generated pages**,
|
|
87
|
+
`fumadocs-openapi` writes **generated MDX stubs into the content tree** (`generateFiles()` output: pages containing `<APIPage>`/`<OpenAPIPage>` with `_openapi` frontmatter), plus `lib/openapi.ts` (`createOpenAPI`) and a generate script. Treat these exactly like Mintlify endpoint stubs: **delete the generated pages**, add `openapi({ spec })` (from `blume/reference`) to the top-level `reference` list (vendor the spec locally), add a `navigation.tabs` entry for the reference route, and remove `fumadocs-openapi`, `lib/openapi.ts`, and the generate script. Keep hand-written conceptual pages (intro/auth) under the reference route.
|
|
88
88
|
|
|
89
89
|
## GraphQL
|
|
90
90
|
|
|
91
|
-
`@fumadocs/graphql` works differently from the OpenAPI flow: **no stub files** — pages are virtual, served through the Loader API. The artifacts to harvest and tear down: `lib/graphql.ts` (`createGraphQL()` — read its `input` for the schema and any per-source routes/labels), the `graphql.staticSource()`/`graphql.loaderPlugin()` wiring in the source config, the `GraphQLPage` component (`createGraphQLPage()`, usually `components/api-page.tsx` — read its playground `endpoint`), and the `@fumadocs/graphql/css/preset.css` import. Map to
|
|
91
|
+
`@fumadocs/graphql` works differently from the OpenAPI flow: **no stub files** — pages are virtual, served through the Loader API. The artifacts to harvest and tear down: `lib/graphql.ts` (`createGraphQL()` — read its `input` for the schema and any per-source routes/labels), the `graphql.staticSource()`/`graphql.loaderPlugin()` wiring in the source config, the `GraphQLPage` component (`createGraphQLPage()`, usually `components/api-page.tsx` — read its playground `endpoint`), and the `@fumadocs/graphql/css/preset.css` import. Map to a `graphql({ spec, endpoint })` entry in the top-level `reference` list (see SKILL.md "GraphQL"): SDL files/text and introspection results carry over as `spec` (vendor a URL input locally); a programmatic `GraphQLSchema` instance must be printed to SDL and committed (report); the `createGraphQLPage` playground endpoint becomes `endpoint`. When `createGraphQL()` takes several inputs, or sources carry their own routes, labels, or endpoints, map each one to an entry in the adapter's `sources` (`{ spec, route, label, endpoint }`) instead of the single `spec` shorthand — otherwise a schema is dropped or mounted on the wrong route. Blume groups routes the same way (`<route>/queries/<field>`, `<route>/objects/<type>`), but slugs are re-derived — rewrite inbound links and let `blume validate` catch strays. Then remove `@fumadocs/graphql`, the two lib/component files, and the CSS import. Since there are no generated pages, there is nothing to delete from the content tree — but keep any hand-written conceptual pages under the reference route.
|
|
92
92
|
|
|
93
93
|
## i18n
|
|
94
94
|
|
|
@@ -28,16 +28,31 @@ Resolve `$ref` includes first (Mintlify splits config across files). Map only wh
|
|
|
28
28
|
| `background.image` | `theme.backgroundImage` (`{ light, dark }`) | same per-mode shape as `background` |
|
|
29
29
|
| `background.decoration` | **drop** | no Blume equivalent |
|
|
30
30
|
| `fonts.family` / `fonts.{heading,body}.family` | `theme.fonts.{display,body}` | a curated slug (kebab-case, e.g. `space-grotesk`) maps directly; any other Google family maps to the object form `{ name: "Family Name" }`; a self-hosted font (`fonts.*.src` URLs) maps to `{ name, variants: [{ src, weight }] }` after downloading the files into the project |
|
|
31
|
-
| `banner` | `banner` (`{ content, dismissible, id, link }`) | **only** those keys — drop `banner.color`/`banner.type` |
|
|
31
|
+
| `banner` | `banner` (`{ content, dismissible, id, link: { href, text } }`) | **only** those keys — drop `banner.color`/`banner.type` |
|
|
32
32
|
| `styling.latex: true` | **drop the field** — block math `$$…$$` renders in `.mdx` with no config | there is **no** `markdown.math` field; inline `$…$` is **not** supported — convert inline math to `$$…$$` or drop it (report) |
|
|
33
|
-
| `styling.codeblocks.theme` | `markdown.
|
|
33
|
+
| `styling.codeblocks.theme` | `markdown.code.theme` (`{ light, dark }`) | |
|
|
34
34
|
| `search.prompt` | **drop** | no equivalent |
|
|
35
35
|
| `seo.metatags` | **drop** | no equivalent; use per-page `seo` frontmatter |
|
|
36
36
|
| `seo.indexing: "all"` | `search.indexing.includeHiddenPages: true` | |
|
|
37
37
|
| `variables` (`{{name}}`) | **inline into content** | Blume has no runtime `{{var}}` substitution — replace each `{{name}}` with its value in the pages |
|
|
38
|
-
| `integrations.posthog` (`{ apiKey, apiHost }`) | `
|
|
39
|
-
| `integrations` (
|
|
40
|
-
| `
|
|
38
|
+
| `integrations.posthog` (`{ apiKey, apiHost, sessionRecording }`) | `posthog({ key, host })` in the `analytics` list | preserve the host verbatim (e.g. `us.posthog.com` — Blume's default is `us.i.posthog.com`); `sessionRecording: false` → `disable_session_recording: true`; every adapter is imported from `blume/analytics` |
|
|
39
|
+
| `integrations.ga4` (`{ measurementId }`) | `googleAnalytics({ id })` | |
|
|
40
|
+
| `integrations.gtm` (`{ tagId }`) | `googleTagManager({ id })` | |
|
|
41
|
+
| `integrations.plausible` (`{ domain, server }`) | `plausible({ domain, host })` | `server` is a bare hostname; `host` is an origin — prepend `https://` |
|
|
42
|
+
| `integrations.fathom` (`{ siteId }`) | `fathom({ site })` | |
|
|
43
|
+
| `integrations.pirsch` (`{ id }`) | `pirsch({ code })` | |
|
|
44
|
+
| `integrations.mixpanel` (`{ projectToken, region }`) | `mixpanel({ token, region })` | |
|
|
45
|
+
| `integrations.amplitude` (`{ apiKey }`) | `amplitude({ key })` | |
|
|
46
|
+
| `integrations.segment` (`{ key, cdnUrl }`) | `segment({ key, cdn })` | |
|
|
47
|
+
| `integrations.hightouch` (`{ writeKey, apiHost }`) | `hightouch({ key, host })` | |
|
|
48
|
+
| `integrations.heap` (`{ appId }`) | `heap({ id })` | |
|
|
49
|
+
| `integrations.hotjar` (`{ hjid, hjsv }`) | `hotjar({ id, version })` | both numbers |
|
|
50
|
+
| `integrations.clarity` (`{ projectId }`) | `clarity({ id })` | |
|
|
51
|
+
| `integrations.logrocket` (`{ apiKey }`) | `logrocket({ id })` | |
|
|
52
|
+
| `integrations.clearbit` (`{ publicApiKey }`) | `clearbit({ key })` | |
|
|
53
|
+
| `integrations.adobe` (`{ launchUrl }`) | `adobe({ url })` | |
|
|
54
|
+
| any other `integrations` script | `script({ src, strategy, attributes })` / `vercel()` in the `analytics` list | one `script()` adapter per provider without a factory |
|
|
55
|
+
| `contextual` (`["copy","chatgpt","claude",…]`) | **mostly free** | Copy-as-Markdown and Open-in-chat are default page actions; `mcp` needs `agents.mcp.enabled` + server output (report as a follow-up) |
|
|
41
56
|
| `redirects` | `redirects: [{ from, to }]` | static only — see below |
|
|
42
57
|
| `navigation.languages` | `i18n` | see i18n below |
|
|
43
58
|
|
|
@@ -112,7 +127,7 @@ Rewrite each page's MDX:
|
|
|
112
127
|
- **`<Tabs>` → `<Tabs inline>`.** Mintlify renders tabs **borderless** — a strip on a full-width rule with the content flowing beneath as prose — while Blume's `<Tabs>` defaults to a bordered box. Add `inline` to each `<Tabs>` to preserve Mintlify's appearance; every child `<Tab title="…">` is unchanged. Don't add `param` — Mintlify tabs switch in place and don't deep-link to the URL, so plain `inline` is the faithful mapping.
|
|
113
128
|
- **These pass through — Blume ships them natively:** `<Columns>`/`<Column>`, `<Expandable>`, `<Tooltip>`, `<Frame>`, `<Panel>`, `<Card>`/`<CardGroup>`, `<Tab>`, `<Steps>`/`<Step>`. Keep them as-is.
|
|
114
129
|
- **API fields → `TypeTable`.** Blume does **not** ship `<ParamField>`/`<ResponseField>`/`<RequestField>`. Convert a cluster of fields into one `<TypeTable>` (rows keyed by field name, each `{ type, required?, default?, description }`). For a fully spec'd API, prefer deleting the hand-written fields and using the [OpenAPI reference](#openapi) instead.
|
|
115
|
-
- **`<Update>`** (a Mintlify changelog entry) has no component form → convert to a `type: changelog` page, or use the `
|
|
130
|
+
- **`<Update>`** (a Mintlify changelog entry) has no component form → convert to a `type: changelog` page, or use the `githubReleases()` source.
|
|
116
131
|
- **Snippets are inlined, not imported.** Blume has no `/snippets` import mechanism. For each `import X from "/snippets/x.mdx"` + `<X prop="v" />`, inline the snippet's body (substituting `{prop}` placeholders), then delete the import and the `/snippets` file. Named string imports (`import { foo } from "/snippets/vars.mdx"`) → inline the value at each `{foo}`.
|
|
117
132
|
|
|
118
133
|
## Frontmatter
|
|
@@ -135,11 +150,11 @@ The codemod leaves the source key in place and reports a conflict rather than cl
|
|
|
135
150
|
|
|
136
151
|
## OpenAPI
|
|
137
152
|
|
|
138
|
-
Top-level `openapi`, `api.openapi`, or a per-group/per-tab `openapi` → `
|
|
153
|
+
Top-level `openapi`, `api.openapi`, or a per-group/per-tab `openapi` → `reference: [openapi({ sources: [{ spec, label?, route? }] })]`, with `openapi` imported from `blume/reference` (`spec` alone is the single-source shorthand; several per-tab specs become several sources, or several `openapi()` entries when they need different routes; a spec the source embedded with Scalar becomes a `scalar({ spec })` entry). A Mintlify `{ source, directory }` object: `directory` → the source's `route`. An `asyncapi` field maps the same way to `asyncapi({ … })` in the list. **Delete every per-endpoint stub page** (frontmatter `openapi: "GET /path"` or a `"GET /path"` nav entry) — Blume's native renderer generates one real page per operation. **Add a `navigation.tabs` entry pointing at the reference `route` yourself** (Mintlify's API tab maps to it); the reference does not create a header tab automatically.
|
|
139
154
|
|
|
140
155
|
- **Vendor the spec.** Mintlify usually points at a spec **URL**. Copying that straight into `spec:` makes every build fetch it at build time — a single point of failure in CI/offline/behind a proxy, and a failed fetch silently drops the reference (leaving the tab pointing at a route that 404s). Prefer downloading it into the repo (`curl … -o openapi/<name>.json`) and pointing `spec` at that local path. If you keep the URL, report the dependency and consider a `prebuild` refresh-with-fallback.
|
|
141
156
|
- **Fix endpoint links.** Blume operation routes are `<route>/<slugified-tag>/<slugified-operationId>` (tag `Models` + id `listModels` → `/api-reference/models/listmodels`) — this differs from Mintlify's endpoint URLs, so **rewrite every inbound link to an operation**. `blume validate` resolves operation pages like any other route and flags the ones you miss.
|
|
142
|
-
- **Keep the "Introduction" page.** Mintlify commonly has a written intro/auth page in an "Introduction" group beside the "Endpoints" (openapi) group in the same tab. Keep it: a normal content page placed under the openapi `route` (e.g. `<root>/api-reference/introduction.mdx`) merges into the reference tab's sidebar alongside the generated operations. Delete only the per-endpoint stubs, not the conceptual pages.
|
|
157
|
+
- **Keep the "Introduction" page.** Mintlify commonly has a written intro/auth page in an "Introduction" group beside the "Endpoints" (openapi) group in the same tab. Keep it: a normal content page placed under the `openapi()` adapter's `route` (e.g. `<root>/api-reference/introduction.mdx`) merges into the reference tab's sidebar alongside the generated operations. Delete only the per-endpoint stubs, not the conceptual pages.
|
|
143
158
|
|
|
144
159
|
## Assets
|
|
145
160
|
|
|
@@ -188,15 +188,15 @@ This is a **manual step — do not fabricate the patch contents.** Leave the use
|
|
|
188
188
|
|
|
189
189
|
## 6. Ultracite / oxfmt formatting → oxfmt patch (ship the bundled patch)
|
|
190
190
|
|
|
191
|
-
If the repo uses (or the user wants to adopt) **[Ultracite](https://www.ultracite.ai)** for formatting — an `ultracite check` / `ultracite fix` script, an `ultracite` dev dep, or oxlint/oxfmt in the toolchain — it will format the migrated `.md`/`.mdx` **and break Blume's `:::` directives.** Ultracite's formatter is **oxfmt**, and under `proseWrap` oxfmt joins the opening/closing `:::` fence line into the surrounding prose, which invalidates the directive (`:::note` … `:::` callouts, tabs, steps — the exact syntax you convert callouts _into_ in step 5). Blume's own repo hits this and pins a patched oxfmt; a migrated repo needs the same patch or every directive silently degrades to literal text on the next `ultracite fix`.
|
|
191
|
+
If the repo uses (or the user wants to adopt) **[Ultracite](https://www.ultracite.ai)** for formatting — an `ultracite check` / `ultracite fix` script, an `ultracite` dev dep, or oxlint/oxfmt in the toolchain — it will format the migrated `.md`/`.mdx` **and break Blume's `:::` directives.** Ultracite's formatter is **oxfmt**, and under `proseWrap` oxfmt joins the opening/closing `:::` fence line into the surrounding prose, which invalidates the directive (`:::note` … `:::` callouts, titled fences like `:::warning[Heads up]`, tabs, steps — the exact syntax you convert callouts _into_ in step 5). Blume's own repo hits this and pins a patched oxfmt; a migrated repo needs the same patch or every directive silently degrades to literal text on the next `ultracite fix`.
|
|
192
192
|
|
|
193
|
-
The fix is a committed **pnpm patch** (`patches/oxfmt@0.
|
|
193
|
+
The fix is a committed **pnpm patch** (`patches/oxfmt@0.67.0.patch`), shipped with this skill at `assets/oxfmt@0.67.0.patch` — the same diff Blume's own repo applies, covering titled fences as well as bare ones. Unlike the Astro/Vite patch, this one is a **known, deterministic diff** — copy it in, don't regenerate it:
|
|
194
194
|
|
|
195
195
|
```bash
|
|
196
196
|
# 1. Copy the shipped patch into the target repo's patches/ dir (keep the exact filename;
|
|
197
197
|
# <skill> = this skill's directory, the one containing SKILL.md):
|
|
198
198
|
mkdir -p patches
|
|
199
|
-
cp "<skill>/assets/oxfmt@0.
|
|
199
|
+
cp "<skill>/assets/oxfmt@0.67.0.patch" patches/oxfmt@0.67.0.patch
|
|
200
200
|
```
|
|
201
201
|
|
|
202
202
|
Then register it under `patchedDependencies` — `pnpm-workspace.yaml` on pnpm 10+, or root `package.json` (`pnpm.patchedDependencies`) on pnpm 9:
|
|
@@ -204,12 +204,12 @@ Then register it under `patchedDependencies` — `pnpm-workspace.yaml` on pnpm 1
|
|
|
204
204
|
```yaml
|
|
205
205
|
# pnpm-workspace.yaml
|
|
206
206
|
patchedDependencies:
|
|
207
|
-
oxfmt@0.
|
|
207
|
+
oxfmt@0.67.0: patches/oxfmt@0.67.0.patch
|
|
208
208
|
```
|
|
209
209
|
|
|
210
210
|
Commit **both** the patch file and the `patchedDependencies` entry, then re-run `pnpm install`.
|
|
211
211
|
|
|
212
|
-
- **The patch is pinned to `oxfmt@0.
|
|
212
|
+
- **The patch is pinned to `oxfmt@0.67.0`** (the version Blume's own repo pins). pnpm requires an exact version match, and the diff targets a file whose name is hashed per oxfmt release (`dist/markdown-*.js`), so it won't apply to any other version. If `pnpm why oxfmt` reports a different one, pin `oxfmt` to `0.67.0` as a direct dev dependency (Ultracite accepts any `oxfmt` ≥ 0.40 as a peer). If the repo can't take that pin, tell the user and fall back to keeping directive-heavy files out of the formatter's globs.
|
|
213
213
|
- **Not on pnpm?** The patch mechanism is pnpm-specific. For npm/yarn, either pin oxfmt and apply the diff with `patch-package`, or exclude `.md`/`.mdx` from Ultracite formatting so it never touches the directives — report whichever you chose.
|
|
214
214
|
|
|
215
215
|
---
|
|
@@ -221,5 +221,5 @@ Commit **both** the patch file and the `patchedDependencies` entry, then re-run
|
|
|
221
221
|
- [ ] Ran plain `pnpm install`; committed `pnpm-lock.yaml` with the `package.json` change; verified `pnpm install --frozen-lockfile` is clean.
|
|
222
222
|
- [ ] Wrote `apps/docs/vercel.json` + package scripts; told the user to set Root Directory + Node 22 in the Vercel project.
|
|
223
223
|
- [ ] Checked for a workspace Vite override; if the build crashes inside Astro/Vite, gave the pnpm-patch recipe.
|
|
224
|
-
- [ ] Uses Ultracite/oxfmt? Shipped `patches/oxfmt@0.
|
|
224
|
+
- [ ] Uses Ultracite/oxfmt? Shipped `patches/oxfmt@0.67.0.patch` + registered it under `patchedDependencies` so formatting doesn't mangle `:::` directives.
|
|
225
225
|
- [ ] Reported every repo-specific edit and every manual step left to the user.
|
|
@@ -26,10 +26,10 @@ Keep content where it is — set `content.root: "src/content/docs"`.
|
|
|
26
26
|
| `sidebar` (array) | filesystem nav / `navigation.sidebar` (see below) |
|
|
27
27
|
| `tableOfContents` (`false` or `{ minHeadingLevel, maxHeadingLevel }`) | `toc` — identical shape, 1:1 |
|
|
28
28
|
| `markdown.headingLinks: false` | `markdown.headingAnchors: false` |
|
|
29
|
-
| `expressiveCode.themes` | `markdown.
|
|
29
|
+
| `expressiveCode.themes` | `markdown.code.theme: { light, dark }` — EC assigns by theme _type_, so match each theme by its darkness, not by array position |
|
|
30
30
|
| `expressiveCode.styleOverrides` | drop → restyle via a root `theme.css` file |
|
|
31
|
-
| `head` | **drop and report** (there is no `seo.metatags`); analytics `<script>` entries → the `analytics`
|
|
32
|
-
| `lastUpdated: true` | `lastModified:
|
|
31
|
+
| `head` | **drop and report** (there is no `seo.metatags`); analytics `<script>` entries → one `script()` adapter each in the `analytics` list (from `blume/analytics`): `attrs.src` → `src`, an `async`/`defer` attr → `strategy`, every other `attrs` key → `attributes`, and an inline body (`content`) → `content` |
|
|
32
|
+
| `lastUpdated: true` | `lastModified: "git"` |
|
|
33
33
|
| `customCss` | drop → move into a root **`theme.css`** file (auto-picked-up; not a config field) |
|
|
34
34
|
| `components` (overrides) | Blume's layout slots via `defineComponents({ layout: { Header, Search, Sidebar, TableOfContents, Footer, … } })` — a near-1:1 map; reach for `blume eject` only beyond those |
|
|
35
35
|
| `plugins` | **map, don't blanket-drop** — see Plugins below |
|
|
@@ -87,7 +87,7 @@ Starlight content is full of Expressive Code fence meta; Blume understands some
|
|
|
87
87
|
|
|
88
88
|
## Plugins — map, don't drop
|
|
89
89
|
|
|
90
|
-
- `starlight-openapi` → Blume's
|
|
90
|
+
- `starlight-openapi` → an `openapi({ sources })` entry in Blume's `reference` list, imported from `blume/reference` (delete any generated pages; add the `navigation.tabs` entry).
|
|
91
91
|
- `starlight-blog` → `type: blog` pages.
|
|
92
92
|
- `starlight-versions` → `navigation.selectors` with `kind: "version"`.
|
|
93
93
|
- `starlight-image-zoom` → delete (Blume zooms content images by default).
|
|
@@ -3,6 +3,7 @@ import { repoUrl } from "../core/github.ts";
|
|
|
3
3
|
import type { BlumeProject } from "../core/project-graph.ts";
|
|
4
4
|
import type { ContentSignalPolicy, ContentSignals } from "../core/schema.ts";
|
|
5
5
|
import { absoluteUrl } from "../core/site-url.ts";
|
|
6
|
+
import { deployPlatform } from "../deploy/platforms/index.ts";
|
|
6
7
|
import { buildRssFeeds } from "../deploy/rss.ts";
|
|
7
8
|
import { AI_CATALOG_PATH, hasAiCatalog } from "./ai-catalog.ts";
|
|
8
9
|
import { hasApiCatalog } from "./api-catalog.ts";
|
|
@@ -90,22 +91,20 @@ export interface AgentReadabilityManifest {
|
|
|
90
91
|
|
|
91
92
|
/**
|
|
92
93
|
* The raw-Markdown mirror pattern. `Accept: text/markdown` negotiation is
|
|
93
|
-
* advertised only where the deployed site actually honors it — a
|
|
94
|
-
*
|
|
95
|
-
*
|
|
96
|
-
*
|
|
97
|
-
*
|
|
98
|
-
*
|
|
99
|
-
* pattern directly.
|
|
94
|
+
* advertised only where the deployed site actually honors it — a server build
|
|
95
|
+
* on a platform that declares `negotiatesMarkdown` (Vercel, whose routing
|
|
96
|
+
* config gets the rewrite rules; Cloudflare, whose deploy bundle gets a
|
|
97
|
+
* wrapper Worker — see `deploy/platforms/*`). Static builds and other
|
|
98
|
+
* adapters serve prerendered pages from a static layer with no request-time
|
|
99
|
+
* hook, so agents there should fetch the `.md` pattern directly.
|
|
100
100
|
*/
|
|
101
101
|
const markdownArtifact = (
|
|
102
102
|
config: BlumeProject["config"],
|
|
103
103
|
abs: (path: string) => string
|
|
104
104
|
): AgentArtifacts["markdown"] => {
|
|
105
105
|
const negotiates =
|
|
106
|
-
config.deployment.output === "server" &&
|
|
107
|
-
(config.deployment.
|
|
108
|
-
config.deployment.adapter === "cloudflare");
|
|
106
|
+
config.deployment.options.output === "server" &&
|
|
107
|
+
deployPlatform(config.deployment).negotiatesMarkdown;
|
|
109
108
|
return negotiates
|
|
110
109
|
? { contentNegotiation: "text/markdown", pattern: abs("/{route}.md") }
|
|
111
110
|
: { pattern: abs("/{route}.md") };
|
|
@@ -116,14 +115,14 @@ const apiArtifact = (
|
|
|
116
115
|
config: BlumeProject["config"],
|
|
117
116
|
abs: (path: string) => string
|
|
118
117
|
): ApiArtifact | null => {
|
|
119
|
-
if (!config.
|
|
118
|
+
if (!config.agents.api) {
|
|
120
119
|
return null;
|
|
121
120
|
}
|
|
122
121
|
const api: ApiArtifact = {
|
|
123
122
|
openapi: abs(OPENAPI_PATH),
|
|
124
123
|
pages: abs(API_PAGES_PATH),
|
|
125
124
|
};
|
|
126
|
-
if (config.deployment.output === "server") {
|
|
125
|
+
if (config.deployment.options.output === "server") {
|
|
127
126
|
api.search = abs(API_SEARCH_PATH);
|
|
128
127
|
}
|
|
129
128
|
return api;
|
|
@@ -135,7 +134,7 @@ const wellKnownArtifacts = (
|
|
|
135
134
|
abs: (path: string) => string
|
|
136
135
|
): WellKnownArtifacts => {
|
|
137
136
|
const artifacts: WellKnownArtifacts = {};
|
|
138
|
-
if (config.
|
|
137
|
+
if (config.agents.webBotAuth.keys.length > 0) {
|
|
139
138
|
artifacts.httpMessageSignaturesDirectory = abs(
|
|
140
139
|
"/.well-known/http-message-signatures-directory"
|
|
141
140
|
);
|
|
@@ -146,7 +145,7 @@ const wellKnownArtifacts = (
|
|
|
146
145
|
if (hasApiCatalog(config)) {
|
|
147
146
|
artifacts.apiCatalog = abs("/.well-known/api-catalog");
|
|
148
147
|
}
|
|
149
|
-
if (config.
|
|
148
|
+
if (config.agents.skills) {
|
|
150
149
|
artifacts.agentSkills = abs("/.well-known/agent-skills/index.json");
|
|
151
150
|
}
|
|
152
151
|
return artifacts;
|
|
@@ -165,14 +164,14 @@ export const buildAgentReadability = (
|
|
|
165
164
|
project: BlumeProject
|
|
166
165
|
): AgentReadabilityManifest | null => {
|
|
167
166
|
const { config } = project;
|
|
168
|
-
if (!config.
|
|
167
|
+
if (!config.agents.agentReadability) {
|
|
169
168
|
return null;
|
|
170
169
|
}
|
|
171
170
|
|
|
172
|
-
const site = config.deployment.site ?? null;
|
|
171
|
+
const site = config.deployment.options.site ?? null;
|
|
173
172
|
// Every artifact is served under `deployment.base` — with or without a
|
|
174
173
|
// `site`; concatenate rather than `new URL()` so the subpath is preserved.
|
|
175
|
-
const deployBase = normalizeBasePath(config.deployment.base);
|
|
174
|
+
const deployBase = normalizeBasePath(config.deployment.options.base);
|
|
176
175
|
const abs = (path: string): string => {
|
|
177
176
|
const based = withBasePath(deployBase, path);
|
|
178
177
|
return site ? absoluteUrl(site, based) : based;
|
|
@@ -185,14 +184,14 @@ export const buildAgentReadability = (
|
|
|
185
184
|
if (api) {
|
|
186
185
|
artifacts.api = api;
|
|
187
186
|
}
|
|
188
|
-
if (config.
|
|
187
|
+
if (config.agents.llmsTxt.enabled) {
|
|
189
188
|
artifacts.llmsFullTxt = abs("/llms-full.txt");
|
|
190
189
|
artifacts.llmsTxt = abs("/llms.txt");
|
|
191
190
|
}
|
|
192
|
-
if (config.
|
|
191
|
+
if (config.agents.mcp.enabled) {
|
|
193
192
|
artifacts.mcp = {
|
|
194
193
|
discovery: abs("/.well-known/mcp.json"),
|
|
195
|
-
url: abs(config.
|
|
194
|
+
url: abs(config.agents.mcp.route),
|
|
196
195
|
};
|
|
197
196
|
}
|
|
198
197
|
if (config.ai.ask?.enabled) {
|
|
@@ -215,11 +214,11 @@ export const buildAgentReadability = (
|
|
|
215
214
|
artifacts,
|
|
216
215
|
description: config.description,
|
|
217
216
|
generator: version ? `blume@${version}` : undefined,
|
|
218
|
-
name: config.
|
|
217
|
+
name: config.agents.mcp.name ?? config.title,
|
|
219
218
|
site,
|
|
220
219
|
};
|
|
221
220
|
|
|
222
|
-
const usage = usagePolicy(config.
|
|
221
|
+
const usage = usagePolicy(config.agents.contentSignals);
|
|
223
222
|
if (usage) {
|
|
224
223
|
manifest.contentUsage = usage;
|
|
225
224
|
}
|
package/src/ai/ai-catalog.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { apiNamePhrase } from "../core/api-name.ts";
|
|
1
2
|
import { normalizeBasePath, withBasePath } from "../core/base-path.ts";
|
|
2
3
|
import type { ResolvedConfig } from "../core/schema.ts";
|
|
3
4
|
import { absoluteUrl } from "../core/site-url.ts";
|
|
@@ -63,6 +64,7 @@ const REFERENCE_KIND_LABEL = {
|
|
|
63
64
|
asyncapi: "AsyncAPI",
|
|
64
65
|
graphql: "GraphQL",
|
|
65
66
|
openapi: "OpenAPI",
|
|
67
|
+
scalar: "API",
|
|
66
68
|
} as const;
|
|
67
69
|
|
|
68
70
|
/** The `urn:air` publisher: the configured site's hostname. */
|
|
@@ -75,12 +77,12 @@ const publisherHost = (site: string): string => new URL(site).hostname;
|
|
|
75
77
|
* header rules, the `Link` header, and the head links read.
|
|
76
78
|
*/
|
|
77
79
|
export const hasAiCatalog = (config: ResolvedConfig): boolean =>
|
|
78
|
-
config.
|
|
79
|
-
Boolean(config.deployment.site) &&
|
|
80
|
-
(config.
|
|
81
|
-
config.
|
|
82
|
-
config.
|
|
83
|
-
Boolean(config.
|
|
80
|
+
config.agents.catalog.enabled &&
|
|
81
|
+
Boolean(config.deployment.options.site) &&
|
|
82
|
+
(config.agents.mcp.enabled ||
|
|
83
|
+
config.agents.api ||
|
|
84
|
+
config.agents.llmsTxt.enabled ||
|
|
85
|
+
Boolean(config.agents.skills) ||
|
|
84
86
|
resolveReferences(config).length > 0);
|
|
85
87
|
|
|
86
88
|
/**
|
|
@@ -97,33 +99,47 @@ export const crossOriginDiscoveryPaths = (config: ResolvedConfig): string[] => {
|
|
|
97
99
|
if (hasApiCatalog(config)) {
|
|
98
100
|
paths.push(API_CATALOG_PATH);
|
|
99
101
|
}
|
|
100
|
-
if (config.
|
|
102
|
+
if (config.agents.mcp.enabled) {
|
|
101
103
|
paths.push("/.well-known/mcp.json", "/.well-known/mcp/server-card.json");
|
|
102
104
|
}
|
|
103
105
|
return paths;
|
|
104
106
|
};
|
|
105
107
|
|
|
108
|
+
/** A site title that already names its docs: "Acme Docs", "Acme Documentation". */
|
|
109
|
+
const NAMES_DOCS = /\b(?:docs|documentation)$/iu;
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* The docs as "the ___" in generated prose: the title followed by `noun`,
|
|
113
|
+
* unless the title already ends in "Docs" or "Documentation" — so "Acme"
|
|
114
|
+
* reads "the Acme documentation" and "Acme Docs" reads "the Acme Docs", not
|
|
115
|
+
* "the Acme Docs docs".
|
|
116
|
+
*/
|
|
117
|
+
const docsPhrase = (title: string, noun: "docs" | "documentation"): string =>
|
|
118
|
+
NAMES_DOCS.test(title.trim()) ? `the ${title}` : `the ${title} ${noun}`;
|
|
119
|
+
|
|
106
120
|
const entrySeeds = (
|
|
107
121
|
config: ResolvedConfig,
|
|
108
122
|
skills: readonly SkillArtifact[],
|
|
109
123
|
abs: (path: string) => string
|
|
110
124
|
): EntrySeed[] => {
|
|
111
125
|
const { title } = config;
|
|
126
|
+
const documentation = docsPhrase(title, "documentation");
|
|
127
|
+
const docs = docsPhrase(title, "docs");
|
|
112
128
|
const seeds: EntrySeed[] = [];
|
|
113
129
|
|
|
114
|
-
if (config.
|
|
115
|
-
const name = config.
|
|
130
|
+
if (config.agents.mcp.enabled) {
|
|
131
|
+
const name = config.agents.mcp.name ?? title;
|
|
116
132
|
seeds.push({
|
|
117
133
|
capabilities: ["search_docs", "get_page", "list_pages", "get_navigation"],
|
|
118
134
|
description:
|
|
119
|
-
config.
|
|
120
|
-
`Model Context Protocol server over
|
|
135
|
+
config.agents.mcp.instructions ??
|
|
136
|
+
`Model Context Protocol server over ${documentation}: full-text search, page Markdown, the page index, and the navigation tree.`,
|
|
121
137
|
displayName: name,
|
|
122
138
|
key: `mcp:${asciiSlugify(name) || "docs"}`,
|
|
123
139
|
queries: [
|
|
124
|
-
`search
|
|
125
|
-
`get a ${
|
|
126
|
-
`list every page in
|
|
140
|
+
`search ${documentation}`,
|
|
141
|
+
`get a page of ${docs} as Markdown`,
|
|
142
|
+
`list every page in ${docs}`,
|
|
127
143
|
],
|
|
128
144
|
type: "application/mcp-server-card+json",
|
|
129
145
|
url: abs("/.well-known/mcp/server-card.json"),
|
|
@@ -147,15 +163,17 @@ const entrySeeds = (
|
|
|
147
163
|
});
|
|
148
164
|
}
|
|
149
165
|
|
|
150
|
-
if (config.
|
|
166
|
+
if (config.agents.api) {
|
|
151
167
|
seeds.push({
|
|
152
|
-
description: `REST API over
|
|
153
|
-
displayName:
|
|
168
|
+
description: `REST API over ${documentation}: the page index, each page as JSON or Markdown, and the navigation tree, described by this OpenAPI document.`,
|
|
169
|
+
displayName: NAMES_DOCS.test(title.trim())
|
|
170
|
+
? `${title} API`
|
|
171
|
+
: `${title} docs API`,
|
|
154
172
|
key: "api:docs",
|
|
155
173
|
queries: [
|
|
156
|
-
`fetch a ${
|
|
157
|
-
`list the pages in
|
|
158
|
-
`get the ${
|
|
174
|
+
`fetch a page of ${docs} as JSON`,
|
|
175
|
+
`list the pages in ${docs}`,
|
|
176
|
+
`get the navigation tree of ${docs}`,
|
|
159
177
|
],
|
|
160
178
|
type: "application/vnd.oai.openapi+json",
|
|
161
179
|
url: abs(OPENAPI_PATH),
|
|
@@ -168,28 +186,28 @@ const entrySeeds = (
|
|
|
168
186
|
// resource this publisher owns — the spec itself is catalogued by URL in
|
|
169
187
|
// the RFC 9727 linkset.
|
|
170
188
|
const docRoute =
|
|
171
|
-
reference.
|
|
172
|
-
?
|
|
173
|
-
: reference.route;
|
|
189
|
+
reference.kind === "scalar"
|
|
190
|
+
? reference.route
|
|
191
|
+
: withBasePath(reference.basePath, reference.route);
|
|
174
192
|
seeds.push({
|
|
175
|
-
description: `${reference.label}: rendered ${REFERENCE_KIND_LABEL[reference.kind]} reference in
|
|
193
|
+
description: `${reference.label}: rendered ${REFERENCE_KIND_LABEL[reference.kind]} reference in ${documentation}.`,
|
|
176
194
|
displayName: reference.label,
|
|
177
195
|
key: `reference:${reference.slug}`,
|
|
178
196
|
queries: [
|
|
179
|
-
`what operations does the ${reference.label}
|
|
180
|
-
`how do I call the ${reference.label}
|
|
197
|
+
`what operations does the ${apiNamePhrase(reference.label)} expose`,
|
|
198
|
+
`how do I call the ${apiNamePhrase(reference.label)}`,
|
|
181
199
|
],
|
|
182
200
|
type: "text/html",
|
|
183
201
|
url: abs(docRoute),
|
|
184
202
|
});
|
|
185
203
|
}
|
|
186
204
|
|
|
187
|
-
if (config.
|
|
205
|
+
if (config.agents.llmsTxt.enabled) {
|
|
188
206
|
seeds.push({
|
|
189
|
-
description: `llms.txt index of
|
|
207
|
+
description: `llms.txt index of ${documentation}: every page with a one-line summary, plus the agent-facing resources on this site.`,
|
|
190
208
|
displayName: `${title} llms.txt`,
|
|
191
209
|
key: "docs:llms-txt",
|
|
192
|
-
queries: [`what is ${title}`, `overview of
|
|
210
|
+
queries: [`what is ${title}`, `overview of ${documentation}`],
|
|
193
211
|
type: "text/plain",
|
|
194
212
|
url: abs("/llms.txt"),
|
|
195
213
|
});
|
|
@@ -203,11 +221,11 @@ export const buildAiCatalog = (
|
|
|
203
221
|
config: ResolvedConfig,
|
|
204
222
|
skills: readonly SkillArtifact[]
|
|
205
223
|
): string | null => {
|
|
206
|
-
const site = config.deployment.site ?? null;
|
|
224
|
+
const site = config.deployment.options.site ?? null;
|
|
207
225
|
if (!(site && hasAiCatalog(config))) {
|
|
208
226
|
return null;
|
|
209
227
|
}
|
|
210
|
-
const deployBase = normalizeBasePath(config.deployment.base);
|
|
228
|
+
const deployBase = normalizeBasePath(config.deployment.options.base);
|
|
211
229
|
const abs = (path: string): string =>
|
|
212
230
|
absoluteUrl(site, withBasePath(deployBase, path));
|
|
213
231
|
const host = publisherHost(site);
|
|
@@ -216,7 +234,7 @@ export const buildAiCatalog = (
|
|
|
216
234
|
displayName: seed.displayName,
|
|
217
235
|
identifier: `urn:air:${host}:${seed.key}`,
|
|
218
236
|
representativeQueries:
|
|
219
|
-
config.
|
|
237
|
+
config.agents.catalog.queries[seed.key] ?? seed.queries,
|
|
220
238
|
type: seed.type,
|
|
221
239
|
url: seed.url,
|
|
222
240
|
};
|
package/src/ai/api/handlers.ts
CHANGED
|
@@ -154,19 +154,43 @@ export const buildPage = (data: McpData, route: string): ApiPage | null => {
|
|
|
154
154
|
return { ...summarize(entry, data), markdown };
|
|
155
155
|
};
|
|
156
156
|
|
|
157
|
+
/** The 404 for a route no page has, at its per-page JSON path. */
|
|
158
|
+
const pageNotFoundResponse = (
|
|
159
|
+
route: string,
|
|
160
|
+
context: ApiSiteContext
|
|
161
|
+
): Response =>
|
|
162
|
+
problemResponse({
|
|
163
|
+
code: "PAGE_NOT_FOUND",
|
|
164
|
+
detail: `No documentation page has the route "${route}".`,
|
|
165
|
+
instance: siteUrl(pageJsonPath(route), context),
|
|
166
|
+
resolution: `List every page at ${siteUrl(API_PAGES_PATH, context)}, or discover the API through ${siteUrl(OPENAPI_PATH, context)}.`,
|
|
167
|
+
status: 404,
|
|
168
|
+
title: "Page not found",
|
|
169
|
+
});
|
|
170
|
+
|
|
157
171
|
export const pageResponse = (data: McpData, route: string): Response => {
|
|
158
172
|
const page = buildPage(data, route);
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
173
|
+
return page ? jsonResponse(page) : pageNotFoundResponse(route, data);
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
const PAGE_JSON_PATH = /^\/api\/docs\/pages\/(?<param>.+)\.json$/u;
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* The route a base-less `pages/{route}.json` path asks for (`index` is the
|
|
180
|
+
* home page), or `undefined` for any other path.
|
|
181
|
+
*/
|
|
182
|
+
const requestedPageRoute = (path: string): string | undefined => {
|
|
183
|
+
const param = PAGE_JSON_PATH.exec(path)?.groups?.param;
|
|
184
|
+
if (param === undefined) {
|
|
185
|
+
return undefined;
|
|
186
|
+
}
|
|
187
|
+
let decoded = param;
|
|
188
|
+
try {
|
|
189
|
+
decoded = decodeURIComponent(param);
|
|
190
|
+
} catch {
|
|
191
|
+
// A malformed escape names no page either; report it as written.
|
|
168
192
|
}
|
|
169
|
-
return
|
|
193
|
+
return decoded === "index" ? "/" : `/${decoded}`;
|
|
170
194
|
};
|
|
171
195
|
|
|
172
196
|
/** The default navigation tree (default locale, current docs). */
|
|
@@ -248,13 +272,24 @@ export const createSearchHandler = (
|
|
|
248
272
|
/**
|
|
249
273
|
* The 404 for anything under `/api/` that no endpoint answers — the catch-all
|
|
250
274
|
* behind every live route on server output, so an agent probing the API
|
|
251
|
-
* namespace gets a problem document instead of the HTML not-found page.
|
|
275
|
+
* namespace gets a problem document instead of the HTML not-found page. A
|
|
276
|
+
* `pages/{route}.json` miss gets the per-page `PAGE_NOT_FOUND` problem.
|
|
252
277
|
*/
|
|
253
278
|
export const apiNotFoundResponse = (
|
|
254
279
|
request: Request,
|
|
255
280
|
context: ApiSiteContext
|
|
256
281
|
): Response => {
|
|
257
282
|
const { pathname } = new URL(request.url);
|
|
283
|
+
// Per-page JSON is prerendered, so a route no page has falls through to
|
|
284
|
+
// this catch-all on server output; answer it as the page miss it is.
|
|
285
|
+
const baseless =
|
|
286
|
+
context.base && pathname.startsWith(`${context.base}/`)
|
|
287
|
+
? pathname.slice(context.base.length)
|
|
288
|
+
: pathname;
|
|
289
|
+
const route = requestedPageRoute(baseless);
|
|
290
|
+
if (route !== undefined) {
|
|
291
|
+
return pageNotFoundResponse(route, context);
|
|
292
|
+
}
|
|
258
293
|
return problemResponse({
|
|
259
294
|
code: "API_ROUTE_NOT_FOUND",
|
|
260
295
|
detail: `No API route exists at ${pathname}.`,
|