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