blume 1.7.2 → 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 +227 -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-xhtpx3ff.js → chunk-1w8dp3qb.js} +17 -16
- package/dist/cli/{chunk-xhtpx3ff.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-9he6crym.js → chunk-6k8vp3ta.js} +25 -13
- package/dist/cli/{chunk-9he6crym.js.map → chunk-6k8vp3ta.js.map} +4 -4
- package/dist/cli/{chunk-mt76t7dj.js → chunk-79njf86q.js} +133 -54
- package/dist/cli/chunk-79njf86q.js.map +11 -0
- package/dist/cli/{chunk-3w7b2vcx.js → chunk-7ez8ny0t.js} +2 -2
- package/dist/cli/{chunk-688e0dde.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-hs3gbh8p.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-9bkjd11x.js → chunk-bw22s759.js} +15 -5
- package/dist/cli/{chunk-9bkjd11x.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-t3tj0dgr.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-exeeb35e.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-12dxjqk7.js → chunk-fh5hj5jt.js} +44 -21
- package/dist/cli/chunk-fh5hj5jt.js.map +10 -0
- package/dist/cli/{chunk-8cd8tj54.js → chunk-j8mw0za6.js} +86 -57
- package/dist/cli/chunk-j8mw0za6.js.map +35 -0
- package/dist/cli/chunk-jts8mvcz.js +106 -0
- package/dist/cli/{chunk-2mzebbbz.js.map → chunk-jts8mvcz.js.map} +6 -4
- package/dist/cli/{chunk-ejjx8znq.js → chunk-mnqj32sj.js} +505 -536
- package/dist/cli/chunk-mnqj32sj.js.map +12 -0
- package/dist/cli/{chunk-196vjxp9.js → chunk-mwt1k8n7.js} +100 -372
- 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-n9sra6sy.js → chunk-pat2zzwc.js} +10 -14
- package/dist/cli/{chunk-n9sra6sy.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-cvky9gb2.js → chunk-sqn5t4q0.js} +81 -87
- package/dist/cli/chunk-sqn5t4q0.js.map +10 -0
- package/dist/cli/{chunk-eevwt1sc.js → chunk-tzne8qfq.js} +15 -15
- package/dist/cli/{chunk-eevwt1sc.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-5n7t497w.js → chunk-z1f5arsg.js} +247 -755
- package/dist/cli/chunk-z1f5arsg.js.map +36 -0
- package/dist/cli/{chunk-hdm2dkd2.js → chunk-zg2gtj10.js} +1086 -2596
- package/dist/cli/chunk-zg2gtj10.js.map +35 -0
- package/dist/cli/{chunk-ppfvdcd4.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 +209 -505
- 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 +28 -11
- 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 +2291 -441
- 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 +20 -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 +176 -61
- package/docs/configuration/customization.mdx +15 -9
- package/docs/configuration/index.mdx +52 -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 +37 -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 +12 -7
- package/docs/content/sources.mdx +145 -50
- package/docs/content/syntax.mdx +26 -12
- package/docs/content/versioning.mdx +3 -3
- package/docs/discoverability/agent-discovery.mdx +91 -10
- package/docs/discoverability/index.mdx +5 -5
- 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 +26 -22
- package/src/ai/ai-catalog.ts +259 -0
- 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 +19 -6
- package/src/ai/llms.ts +26 -15
- package/src/ai/markdown.ts +35 -5
- package/src/ai/mcp/data.ts +9 -5
- package/src/ai/mcp/discovery.ts +1 -1
- 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 +114 -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 -314
- 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 +75 -3
- 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 -43
- package/src/components/layout/Search.astro +30 -6
- package/src/components/layout/WebMcp.astro +1 -1
- package/src/components/layout/analytics-client.ts +101 -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 +212 -543
- package/src/core/config.ts +130 -41
- package/src/core/custom-pages.ts +105 -0
- package/src/core/data.ts +32 -11
- 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 +137 -19
- 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 +531 -721
- 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 +20 -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 +67 -28
- package/src/deploy/cloudflare-negotiation.ts +179 -100
- package/src/deploy/function-bundle.ts +18 -3
- package/src/deploy/headers.ts +129 -22
- 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 +27 -4
- 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 +33 -7
- 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 +47 -2
- package/src/translate/report.ts +40 -7
- package/src/upgrade/upgrade.ts +499 -0
- package/dist/cli/chunk-12dxjqk7.js.map +0 -10
- package/dist/cli/chunk-196vjxp9.js.map +0 -13
- package/dist/cli/chunk-2mzebbbz.js +0 -69
- package/dist/cli/chunk-2z47ypj8.js.map +0 -11
- package/dist/cli/chunk-30e87n55.js +0 -108
- package/dist/cli/chunk-30e87n55.js.map +0 -10
- package/dist/cli/chunk-450a7rcr.js +0 -185
- package/dist/cli/chunk-450a7rcr.js.map +0 -11
- package/dist/cli/chunk-5n7t497w.js.map +0 -40
- package/dist/cli/chunk-61j18dwk.js +0 -5342
- package/dist/cli/chunk-61j18dwk.js.map +0 -58
- package/dist/cli/chunk-88by27n5.js +0 -17
- package/dist/cli/chunk-88by27n5.js.map +0 -10
- package/dist/cli/chunk-8cd8tj54.js.map +0 -34
- package/dist/cli/chunk-aztttvb3.js +0 -381
- package/dist/cli/chunk-aztttvb3.js.map +0 -12
- package/dist/cli/chunk-cvky9gb2.js.map +0 -11
- package/dist/cli/chunk-ejjx8znq.js.map +0 -15
- package/dist/cli/chunk-fmceyezb.js +0 -1007
- package/dist/cli/chunk-fmceyezb.js.map +0 -13
- package/dist/cli/chunk-hdm2dkd2.js.map +0 -48
- package/dist/cli/chunk-hs3gbh8p.js.map +0 -10
- package/dist/cli/chunk-jbj4qhfw.js +0 -30
- package/dist/cli/chunk-jbj4qhfw.js.map +0 -10
- package/dist/cli/chunk-mqb2ka8m.js +0 -68
- package/dist/cli/chunk-mqb2ka8m.js.map +0 -10
- package/dist/cli/chunk-mt76t7dj.js.map +0 -11
- package/dist/cli/chunk-q4rae3bg.js +0 -60
- package/dist/cli/chunk-q4rae3bg.js.map +0 -10
- package/dist/cli/chunk-ra1v2nc2.js +0 -35
- package/dist/cli/chunk-ra1v2nc2.js.map +0 -10
- package/dist/cli/chunk-t3tj0dgr.js.map +0 -15
- package/dist/cli/chunk-tqa1s0k8.js +0 -69
- package/dist/cli/chunk-tqa1s0k8.js.map +0 -11
- package/dist/cli/chunk-vh9w1sgp.js +0 -73
- package/dist/cli/chunk-vh9w1sgp.js.map +0 -10
- package/dist/cli/chunk-vkrsvbr5.js +0 -107
- package/dist/cli/chunk-vkrsvbr5.js.map +0 -11
- package/dist/cli/chunk-vrfp10qk.js +0 -81
- package/dist/cli/chunk-vrfp10qk.js.map +0 -10
- package/dist/cli/chunk-wjt80jps.js +0 -1049
- package/dist/cli/chunk-wjt80jps.js.map +0 -24
- 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-3w7b2vcx.js.map → chunk-7ez8ny0t.js.map} +0 -0
- /package/dist/cli/{chunk-688e0dde.js.map → chunk-88cpgt6h.js.map} +0 -0
- /package/dist/cli/{chunk-exeeb35e.js.map → chunk-f7t03s3g.js.map} +0 -0
- /package/dist/cli/{chunk-ppfvdcd4.js.map → chunk-zxccj738.js.map} +0 -0
package/src/ai/llms.ts
CHANGED
|
@@ -6,9 +6,11 @@ import { absoluteUrl } from "../core/site-url.ts";
|
|
|
6
6
|
import { readExpandedEntryText } from "../core/sources/read.ts";
|
|
7
7
|
import type { NavNode, Navigation, PageRecord } from "../core/types.ts";
|
|
8
8
|
import { buildRssFeeds } from "../deploy/rss.ts";
|
|
9
|
+
import { AI_CATALOG_PATH, hasAiCatalog } from "./ai-catalog.ts";
|
|
9
10
|
import { API_CATALOG_PATH, hasApiCatalog } from "./api-catalog.ts";
|
|
10
11
|
import { API_PAGES_PATH, OPENAPI_PATH } from "./api/paths.ts";
|
|
11
12
|
import { downlevelComponents } from "./component-markdown.ts";
|
|
13
|
+
import { relativeLinkRewriter } from "./relative-links.ts";
|
|
12
14
|
import { projectComponentSerializers } from "./serializers.ts";
|
|
13
15
|
import { AGENT_SKILLS_DIR, AGENT_SKILLS_INDEX_PATH } from "./skills.ts";
|
|
14
16
|
import type { SkillArtifact } from "./skills.ts";
|
|
@@ -48,24 +50,24 @@ const oneLine = (text: string): string => text.replaceAll(/\s+/gu, " ").trim();
|
|
|
48
50
|
*/
|
|
49
51
|
const agentResourceLines = (project: BlumeProject): string[] => {
|
|
50
52
|
const { config } = project;
|
|
51
|
-
const { site } = config.deployment;
|
|
53
|
+
const { site } = config.deployment.options;
|
|
52
54
|
const url = (path: string): string =>
|
|
53
|
-
pageUrl(path, site, normalizeBasePath(config.deployment.base));
|
|
55
|
+
pageUrl(path, site, normalizeBasePath(config.deployment.options.base));
|
|
54
56
|
const lines = [
|
|
55
57
|
`- [llms-full.txt](${url("/llms-full.txt")}): The full Markdown of every page in one file.`,
|
|
56
58
|
`- [Page Markdown](${url("/index.md")}): Append \`.md\` to any page URL to fetch that page as raw Markdown.`,
|
|
57
59
|
];
|
|
58
|
-
if (config.
|
|
60
|
+
if (config.agents.api) {
|
|
59
61
|
lines.push(
|
|
60
62
|
`- [JSON API](${url(API_PAGES_PATH)}): Page index of the JSON docs API; each entry links the page's JSON and Markdown forms. Described by the OpenAPI document at ${url(OPENAPI_PATH)}.`
|
|
61
63
|
);
|
|
62
64
|
}
|
|
63
|
-
if (config.
|
|
65
|
+
if (config.agents.mcp.enabled) {
|
|
64
66
|
lines.push(
|
|
65
|
-
`- [MCP server](${url(config.
|
|
67
|
+
`- [MCP server](${url(config.agents.mcp.route)}): Streamable HTTP Model Context Protocol server with search_docs, get_page, list_pages, and get_navigation tools, plus every page as a resource. Discovery document: ${url("/.well-known/mcp.json")}`
|
|
66
68
|
);
|
|
67
69
|
}
|
|
68
|
-
if (config.
|
|
70
|
+
if (config.agents.skills) {
|
|
69
71
|
lines.push(
|
|
70
72
|
`- [Agent skills](${url(AGENT_SKILLS_INDEX_PATH)}): Agent Skills discovery index of the skills this site publishes.`
|
|
71
73
|
);
|
|
@@ -75,7 +77,12 @@ const agentResourceLines = (project: BlumeProject): string[] => {
|
|
|
75
77
|
`- [API catalog](${url(API_CATALOG_PATH)}): RFC 9727 linkset of the APIs documented here.`
|
|
76
78
|
);
|
|
77
79
|
}
|
|
78
|
-
if (config
|
|
80
|
+
if (hasAiCatalog(config)) {
|
|
81
|
+
lines.push(
|
|
82
|
+
`- [AI catalog](${url(AI_CATALOG_PATH)}): ARD manifest of the agent-facing resources on this site (MCP server, skills, APIs).`
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
if (config.agents.agentReadability) {
|
|
79
86
|
lines.push(
|
|
80
87
|
`- [agent-readability.json](${url("/agent-readability.json")}): Manifest of every agent-facing artifact on this site.`
|
|
81
88
|
);
|
|
@@ -90,7 +97,7 @@ const agentResourceLines = (project: BlumeProject): string[] => {
|
|
|
90
97
|
|
|
91
98
|
// Drafts, hidden, and ordinary `noindex` pages are excluded. Generated API
|
|
92
99
|
// references keep crawler visibility (`noindex`) separate from LLM visibility
|
|
93
|
-
// (`ai.exclude`), and are excluded wholesale when `
|
|
100
|
+
// (`ai.exclude`), and are excluded wholesale when `agents.llmsTxt.openapi` is off.
|
|
94
101
|
// `versions: "current"` additionally drops archived-snapshot pages — the flat
|
|
95
102
|
// llms-full.txt dump serves agents the live docs, not every frozen copy.
|
|
96
103
|
const eligiblePages = (
|
|
@@ -106,7 +113,7 @@ const eligiblePages = (
|
|
|
106
113
|
(page.meta.seo.noindex && page.source.name !== "openapi") ||
|
|
107
114
|
(options.versions === "current" && page.version !== "")
|
|
108
115
|
) &&
|
|
109
|
-
(project.config.
|
|
116
|
+
(project.config.agents.llmsTxt.openapi || page.source.name !== "openapi")
|
|
110
117
|
);
|
|
111
118
|
|
|
112
119
|
/**
|
|
@@ -160,8 +167,8 @@ export const buildLlmsIndex = (
|
|
|
160
167
|
options: LlmsIndexOptions = {}
|
|
161
168
|
): string => {
|
|
162
169
|
const { config } = project;
|
|
163
|
-
const { site } = config.deployment;
|
|
164
|
-
const base = normalizeBasePath(config.deployment.base);
|
|
170
|
+
const { site } = config.deployment.options;
|
|
171
|
+
const base = normalizeBasePath(config.deployment.options.base);
|
|
165
172
|
const eligible = eligiblePages(project);
|
|
166
173
|
const byRoute = new Map(eligible.map((page) => [page.route, page]));
|
|
167
174
|
const seen = new Set<string>();
|
|
@@ -279,7 +286,7 @@ export const buildLlmsIndex = (
|
|
|
279
286
|
: `# ${config.title}`;
|
|
280
287
|
// `details` is the llms.txt spec's free-form block between the summary and
|
|
281
288
|
// the file sections — "when to use this" guidance in the site's own words.
|
|
282
|
-
const { details } = config.
|
|
289
|
+
const { details } = config.agents.llmsTxt;
|
|
283
290
|
const lead = details ? `${header}\n\n${details}` : header;
|
|
284
291
|
return `${[lead, ...blocks].join("\n\n")}\n`;
|
|
285
292
|
};
|
|
@@ -291,6 +298,7 @@ const buildFull = async (project: BlumeProject): Promise<string> => {
|
|
|
291
298
|
(a, b) => a.route.localeCompare(b.route)
|
|
292
299
|
);
|
|
293
300
|
const components = projectComponentSerializers(project);
|
|
301
|
+
const rewriteLinks = relativeLinkRewriter(project);
|
|
294
302
|
|
|
295
303
|
const sections = await Promise.all(
|
|
296
304
|
pages.map(async (page) => {
|
|
@@ -299,11 +307,14 @@ const buildFull = async (project: BlumeProject): Promise<string> => {
|
|
|
299
307
|
// llms-full.txt; point them at the served originals instead.
|
|
300
308
|
if (page.sourcePath) {
|
|
301
309
|
raw = rewriteRelativeImages({
|
|
302
|
-
deployBase: config.deployment.base,
|
|
310
|
+
deployBase: config.deployment.options.base,
|
|
303
311
|
projectRoot: project.context.root,
|
|
304
312
|
source: raw,
|
|
305
313
|
sourcePath: page.sourcePath,
|
|
306
314
|
});
|
|
315
|
+
// Relative page links too: a reader of one flat file has no page URL
|
|
316
|
+
// to resolve `./install` against.
|
|
317
|
+
raw = rewriteLinks(raw, page);
|
|
307
318
|
}
|
|
308
319
|
// Resolve `<Visibility>` audiences (web-only content omitted from the
|
|
309
320
|
// agent-facing output, agents-only unwrapped), then downlevel supported
|
|
@@ -316,8 +327,8 @@ const buildFull = async (project: BlumeProject): Promise<string> => {
|
|
|
316
327
|
).trim();
|
|
317
328
|
const url = pageUrl(
|
|
318
329
|
page.route,
|
|
319
|
-
config.deployment.site,
|
|
320
|
-
normalizeBasePath(config.deployment.base)
|
|
330
|
+
config.deployment.options.site,
|
|
331
|
+
normalizeBasePath(config.deployment.options.base)
|
|
321
332
|
);
|
|
322
333
|
return [`# ${page.title}`, `Source: ${url}`, "", body].join("\n");
|
|
323
334
|
})
|
package/src/ai/markdown.ts
CHANGED
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
import { readFile } from "node:fs/promises";
|
|
2
2
|
|
|
3
|
+
import { hasGeneratedChangelog } from "../astro/pages.ts";
|
|
4
|
+
import { CHANGELOG_INDEX_ROUTE } from "../core/changelog-index.ts";
|
|
3
5
|
import { rewriteRelativeImages } from "../core/content-assets.ts";
|
|
6
|
+
import { discoverPages, discoverPagesSync } from "../core/custom-pages.ts";
|
|
4
7
|
import matter from "../core/frontmatter.ts";
|
|
5
8
|
import type { BlumeProject } from "../core/project-graph.ts";
|
|
6
9
|
import { readExpandedEntryText } from "../core/sources/read.ts";
|
|
7
10
|
import type { RouteManifestEntry } from "../core/types.ts";
|
|
11
|
+
import { buildChangelogIndexMarkdown } from "./changelog-markdown.ts";
|
|
8
12
|
import { downlevelComponents } from "./component-markdown.ts";
|
|
9
13
|
import { buildLlmsIndex } from "./llms.ts";
|
|
14
|
+
import { relativeLinkRewriter } from "./relative-links.ts";
|
|
10
15
|
import { projectComponentSerializers } from "./serializers.ts";
|
|
11
16
|
import { applyAgentVisibility } from "./visibility.ts";
|
|
12
17
|
|
|
@@ -46,7 +51,8 @@ export const markdownTokenCount = (text: string): number =>
|
|
|
46
51
|
* removed, agents-only unwrapped. Relative image references are rewritten to
|
|
47
52
|
* their served `/blume-assets/content/…` URLs in both variants too — an agent
|
|
48
53
|
* fetches these endpoints by URL, where a colocated `./diagram.png` resolves
|
|
49
|
-
* to nothing
|
|
54
|
+
* to nothing — and relative page links to the routes they mean, as the
|
|
55
|
+
* rendered page's are (see `relative-links.ts`).
|
|
50
56
|
*/
|
|
51
57
|
export const buildRawMarkdown = async (
|
|
52
58
|
project: BlumeProject
|
|
@@ -54,6 +60,7 @@ export const buildRawMarkdown = async (
|
|
|
54
60
|
const pageById = new Map(project.graph.pages.map((page) => [page.id, page]));
|
|
55
61
|
|
|
56
62
|
const components = projectComponentSerializers(project);
|
|
63
|
+
const rewriteLinks = relativeLinkRewriter(project);
|
|
57
64
|
|
|
58
65
|
const readRoute = async (route: RouteManifestEntry): Promise<string> => {
|
|
59
66
|
const page = pageById.get(route.id);
|
|
@@ -68,11 +75,17 @@ export const buildRawMarkdown = async (
|
|
|
68
75
|
let text = await readRoute(route);
|
|
69
76
|
if (route.sourcePath) {
|
|
70
77
|
text = rewriteRelativeImages({
|
|
71
|
-
deployBase: project.config.deployment.base,
|
|
78
|
+
deployBase: project.config.deployment.options.base,
|
|
72
79
|
projectRoot: project.context.root,
|
|
73
80
|
source: text,
|
|
74
81
|
sourcePath: route.sourcePath,
|
|
75
82
|
});
|
|
83
|
+
// `./install` means the page's sibling, not whatever the `.md` URL
|
|
84
|
+
// an agent fetched resolves it to.
|
|
85
|
+
text = rewriteLinks(text, {
|
|
86
|
+
route: route.path,
|
|
87
|
+
sourcePath: route.sourcePath,
|
|
88
|
+
});
|
|
76
89
|
}
|
|
77
90
|
const source = applyAgentVisibility(text);
|
|
78
91
|
// The `.md` variant keeps the front-matter block in the output, but its
|
|
@@ -92,18 +105,35 @@ export const buildRawMarkdown = async (
|
|
|
92
105
|
if (!map["/"]) {
|
|
93
106
|
map["/"] = { mdx: buildLlmsIndex(project) };
|
|
94
107
|
}
|
|
108
|
+
// The generated changelog index has no source either; its release list is
|
|
109
|
+
// its mirror, so `/changelog.md` and `get_page` answer as the page does.
|
|
110
|
+
const userPages = project.context.pagesRoot
|
|
111
|
+
? await discoverPages(project.context.pagesRoot)
|
|
112
|
+
: [];
|
|
113
|
+
if (hasGeneratedChangelog(project, userPages)) {
|
|
114
|
+
map[CHANGELOG_INDEX_ROUTE] = { mdx: buildChangelogIndexMarkdown(project) };
|
|
115
|
+
}
|
|
95
116
|
return map;
|
|
96
117
|
};
|
|
97
118
|
|
|
98
119
|
/**
|
|
99
120
|
* Every route path with a raw-Markdown mirror: the manifest routes, plus the
|
|
100
|
-
* homepage when its mirror is the synthesized llms.txt fallback
|
|
101
|
-
* `buildRawMarkdown`). This is the route list the negotiation surfaces (dev
|
|
121
|
+
* homepage when its mirror is the synthesized llms.txt fallback and the
|
|
122
|
+
* generated changelog index (see `buildRawMarkdown`). This is the route list the negotiation surfaces (dev
|
|
102
123
|
* middleware, Vercel routing config) and the homepage `Link` header build
|
|
103
124
|
* from, so `Accept: text/markdown` on `/` resolves even when the homepage is
|
|
104
125
|
* a landing page.
|
|
105
126
|
*/
|
|
106
127
|
export const markdownRoutePaths = (project: BlumeProject): string[] => {
|
|
107
128
|
const paths = project.manifest.routes.map((route) => route.path);
|
|
108
|
-
|
|
129
|
+
if (!paths.includes("/")) {
|
|
130
|
+
paths.push("/");
|
|
131
|
+
}
|
|
132
|
+
const userPages = project.context.pagesRoot
|
|
133
|
+
? discoverPagesSync(project.context.pagesRoot)
|
|
134
|
+
: [];
|
|
135
|
+
if (hasGeneratedChangelog(project, userPages)) {
|
|
136
|
+
paths.push(CHANGELOG_INDEX_ROUTE);
|
|
137
|
+
}
|
|
138
|
+
return paths;
|
|
109
139
|
};
|
package/src/ai/mcp/data.ts
CHANGED
|
@@ -88,8 +88,12 @@ export const buildMcpData = async (project: BlumeProject): Promise<McpData> => {
|
|
|
88
88
|
const pageById = new Map(graph.pages.map((page) => [page.id, page]));
|
|
89
89
|
|
|
90
90
|
const routes: McpRoute[] = [];
|
|
91
|
+
// Fallback routes render the fallback locale's page at another locale's
|
|
92
|
+
// URL: listing them would pass that page off as a translation, once per
|
|
93
|
+
// locale. `get_page` still resolves them through `pages`, as llms.txt and
|
|
94
|
+
// search leave them out.
|
|
91
95
|
for (const route of manifest.routes) {
|
|
92
|
-
if (route.hidden) {
|
|
96
|
+
if (route.hidden || route.fallback) {
|
|
93
97
|
continue;
|
|
94
98
|
}
|
|
95
99
|
const page = pageById.get(route.id);
|
|
@@ -111,7 +115,7 @@ export const buildMcpData = async (project: BlumeProject): Promise<McpData> => {
|
|
|
111
115
|
}
|
|
112
116
|
|
|
113
117
|
const data: McpData = {
|
|
114
|
-
base: normalizeBasePath(config.deployment.base),
|
|
118
|
+
base: normalizeBasePath(config.deployment.options.base),
|
|
115
119
|
defaultLocale: config.i18n?.defaultLocale,
|
|
116
120
|
documents: documents.map((doc) => {
|
|
117
121
|
const document: OramaDoc = {
|
|
@@ -128,12 +132,12 @@ export const buildMcpData = async (project: BlumeProject): Promise<McpData> => {
|
|
|
128
132
|
}
|
|
129
133
|
return document;
|
|
130
134
|
}),
|
|
131
|
-
instructions: config.
|
|
132
|
-
name: config.
|
|
135
|
+
instructions: config.agents.mcp.instructions,
|
|
136
|
+
name: config.agents.mcp.name ?? config.title,
|
|
133
137
|
navigation: graph.navigation,
|
|
134
138
|
pages,
|
|
135
139
|
routes,
|
|
136
|
-
site: config.deployment.site ?? null,
|
|
140
|
+
site: config.deployment.options.site ?? null,
|
|
137
141
|
version: manifest.blumeVersion,
|
|
138
142
|
};
|
|
139
143
|
if (config.versions) {
|
package/src/ai/mcp/discovery.ts
CHANGED
|
@@ -56,7 +56,7 @@ const truncate = (text: string): string =>
|
|
|
56
56
|
const NON_ASCII_SLUG = /[^a-z0-9]+/gu;
|
|
57
57
|
const COMBINING_MARKS = /\p{M}+/gu;
|
|
58
58
|
|
|
59
|
-
const asciiSlugify = (text: string): string =>
|
|
59
|
+
export const asciiSlugify = (text: string): string =>
|
|
60
60
|
trimChar(
|
|
61
61
|
text
|
|
62
62
|
.normalize("NFKD")
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { ApiOperationRef, OpenApiData } from "../openapi/model.ts";
|
|
2
2
|
import { operationOf, specAddresses, specOf } from "../openapi/model.ts";
|
|
3
|
+
import { asSentence } from "../openapi/sentence.ts";
|
|
3
4
|
import { operationSignature } from "../openapi/signature.ts";
|
|
4
5
|
import type {
|
|
5
6
|
ComponentMarkdown,
|
|
@@ -25,7 +26,9 @@ const listItem = (
|
|
|
25
26
|
operation: Pick<ApiOperationRef, "deprecated" | "route" | "summary">
|
|
26
27
|
): string => {
|
|
27
28
|
const tail = [
|
|
28
|
-
|
|
29
|
+
// Title-like summaries ("Get a flag") need their own period before the
|
|
30
|
+
// "Deprecated." that may follow.
|
|
31
|
+
inlineText(asSentence(operation.summary.trim())),
|
|
29
32
|
operation.deprecated ? "Deprecated." : "",
|
|
30
33
|
]
|
|
31
34
|
.filter(Boolean)
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { basename } from "pathe";
|
|
2
|
+
|
|
3
|
+
import { normalizeBasePath, withBasePath } from "../core/base-path.ts";
|
|
4
|
+
import { nextFenceState } from "../core/code-fences.ts";
|
|
5
|
+
import type { FenceState } from "../core/code-fences.ts";
|
|
6
|
+
import {
|
|
7
|
+
buildFileRouteIndex,
|
|
8
|
+
isIndexFileName,
|
|
9
|
+
resolveRelativeHref,
|
|
10
|
+
routeOfLinkedFile,
|
|
11
|
+
} from "../core/links.ts";
|
|
12
|
+
import type { RelativeLinkBase } from "../core/links.ts";
|
|
13
|
+
import type { BlumeProject } from "../core/project-graph.ts";
|
|
14
|
+
import { extractLinks } from "../core/sources/normalize.ts";
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Relative page links on the agent surfaces — the `.md`/`.mdx` mirrors,
|
|
18
|
+
* llms-full.txt, MCP `get_page` and `resources/read`. An agent resolves
|
|
19
|
+
* `[Install](./install)` against the URL it fetched (`/guides.md`), so the
|
|
20
|
+
* link lands on `/install`; the rendered page rewrites it to the route it
|
|
21
|
+
* means (`markdown/relative-links.ts`), and the Markdown an agent reads gets
|
|
22
|
+
* the same rewrite from the same resolver (`resolveRelativeHref`), so both
|
|
23
|
+
* point at one page. Inline links and reference definitions are rewritten;
|
|
24
|
+
* fenced and inline code, images, and anything not a relative page link are
|
|
25
|
+
* left as written.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
/** The page a Markdown text was written for. */
|
|
29
|
+
export interface LinkedPage {
|
|
30
|
+
route: string;
|
|
31
|
+
sourcePath?: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Rewrite a page's relative page links to the routes they mean. */
|
|
35
|
+
export type RelativeLinkRewriter = (text: string, page: LinkedPage) => string;
|
|
36
|
+
|
|
37
|
+
/** A reference definition's target: `[label]: ./install` or `<./install>`. */
|
|
38
|
+
const DEFINITION =
|
|
39
|
+
/^(?<lead> {0,3}\[(?:[^\]\\]|\\.)+\]:[\t ]*)(?:<(?<angled>[^>]*)>|(?<bare>\S+))/u;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Whether a text could hold a relative page link at all: an inline link, a
|
|
43
|
+
* reference definition, or a component `href` whose target isn't a URL with
|
|
44
|
+
* a scheme, a root path, or a fragment. Most pages hold none, and those skip
|
|
45
|
+
* the link parse and the line-by-line fence scan entirely.
|
|
46
|
+
*/
|
|
47
|
+
const MAYBE_RELATIVE =
|
|
48
|
+
/\]\([\t ]*<?(?![a-z][\d+.a-z-]*:|\/|#)|^ {0,3}\[[^\]\n]+\]:[\t ]*<?(?![a-z][\d+.a-z-]*:|\/|#)|\shref=["'](?![a-z][\d+.a-z-]*:|\/|#)/imu;
|
|
49
|
+
|
|
50
|
+
interface Splice {
|
|
51
|
+
column: number;
|
|
52
|
+
length: number;
|
|
53
|
+
text: string;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** Apply same-line splices, right to left so earlier columns stay valid. */
|
|
57
|
+
const spliceLine = (line: string, splices: readonly Splice[]): string => {
|
|
58
|
+
let out = line;
|
|
59
|
+
for (const splice of splices.toSorted((a, b) => b.column - a.column)) {
|
|
60
|
+
out =
|
|
61
|
+
out.slice(0, splice.column) +
|
|
62
|
+
splice.text +
|
|
63
|
+
out.slice(splice.column + splice.length);
|
|
64
|
+
}
|
|
65
|
+
return out;
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
/** One line's reference-definition splice, when it defines a routed target. */
|
|
69
|
+
const definitionSplice = (
|
|
70
|
+
line: string,
|
|
71
|
+
routed: (target: string) => string | undefined
|
|
72
|
+
): Splice | undefined => {
|
|
73
|
+
const groups = DEFINITION.exec(line)?.groups;
|
|
74
|
+
const lead = groups?.lead;
|
|
75
|
+
const target = groups?.angled ?? groups?.bare;
|
|
76
|
+
const route = target === undefined ? undefined : routed(target);
|
|
77
|
+
if (lead === undefined || target === undefined || route === undefined) {
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
// An angle-bracketed target starts one past its `<`.
|
|
81
|
+
const angled = groups?.angled === undefined ? 0 : 1;
|
|
82
|
+
return { column: lead.length + angled, length: target.length, text: route };
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
/** Every routed splice in `text`, by 0-based line: links, then definitions. */
|
|
86
|
+
const collectSplices = (
|
|
87
|
+
text: string,
|
|
88
|
+
lines: readonly string[],
|
|
89
|
+
routed: (target: string) => string | undefined
|
|
90
|
+
): Map<number, Splice[]> => {
|
|
91
|
+
const splices = new Map<number, Splice[]>();
|
|
92
|
+
const add = (index: number, splice: Splice): void => {
|
|
93
|
+
splices.set(index, [...(splices.get(index) ?? []), splice]);
|
|
94
|
+
};
|
|
95
|
+
for (const link of extractLinks(text)) {
|
|
96
|
+
const route = link.image ? undefined : routed(link.target);
|
|
97
|
+
if (route !== undefined) {
|
|
98
|
+
add(link.line - 1, {
|
|
99
|
+
column: link.column - 1,
|
|
100
|
+
length: link.target.length,
|
|
101
|
+
text: route,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
let fence: FenceState = null;
|
|
106
|
+
for (const [index, line] of lines.entries()) {
|
|
107
|
+
const next = nextFenceState(line, fence);
|
|
108
|
+
const inFence = fence !== null || next !== null;
|
|
109
|
+
fence = next;
|
|
110
|
+
const splice = inFence ? undefined : definitionSplice(line, routed);
|
|
111
|
+
if (splice !== undefined) {
|
|
112
|
+
add(index, splice);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return splices;
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Build the rewriter for a project: the file → route lookup a `.md`/`.mdx`
|
|
120
|
+
* link resolves through is built once. A file shared by every locale
|
|
121
|
+
* publishes once per locale, and the default locale's route stands for it;
|
|
122
|
+
* fallback copies render another locale's file, so they never stand for one.
|
|
123
|
+
*/
|
|
124
|
+
export const relativeLinkRewriter = (
|
|
125
|
+
project: BlumeProject
|
|
126
|
+
): RelativeLinkRewriter => {
|
|
127
|
+
const { deployment, i18n } = project.config;
|
|
128
|
+
const deployBase = normalizeBasePath(deployment.options.base);
|
|
129
|
+
const localeTokens = i18n
|
|
130
|
+
? ["$", ...i18n.locales.map((locale) => locale.code)]
|
|
131
|
+
: [];
|
|
132
|
+
const fileRoutes = buildFileRouteIndex(project.graph.pages, i18n ?? null);
|
|
133
|
+
const navPathBySource = new Map(
|
|
134
|
+
project.graph.pages.map((graphPage) => [
|
|
135
|
+
graphPage.sourcePath,
|
|
136
|
+
graphPage.navPath,
|
|
137
|
+
])
|
|
138
|
+
);
|
|
139
|
+
const routes = new Set(project.manifest.routes.map((route) => route.path));
|
|
140
|
+
|
|
141
|
+
return (text, page) => {
|
|
142
|
+
const { sourcePath } = page;
|
|
143
|
+
if (!sourcePath || !MAYBE_RELATIVE.test(text)) {
|
|
144
|
+
return text;
|
|
145
|
+
}
|
|
146
|
+
const from: RelativeLinkBase = {
|
|
147
|
+
isIndex: isIndexFileName(basename(sourcePath), localeTokens),
|
|
148
|
+
route: page.route,
|
|
149
|
+
};
|
|
150
|
+
const navPath = navPathBySource.get(sourcePath) ?? basename(sourcePath);
|
|
151
|
+
const resolveFile = (path: string): string | undefined =>
|
|
152
|
+
routeOfLinkedFile(fileRoutes, { navPath, sourcePath }, path);
|
|
153
|
+
const routed = (target: string): string | undefined => {
|
|
154
|
+
const route = resolveRelativeHref(target, from, resolveFile, (path) =>
|
|
155
|
+
routes.has(path)
|
|
156
|
+
);
|
|
157
|
+
return route === undefined ? undefined : withBasePath(deployBase, route);
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
const lines = text.split("\n");
|
|
161
|
+
const splices = collectSplices(text, lines, routed);
|
|
162
|
+
|
|
163
|
+
return lines
|
|
164
|
+
.map((line, index) => {
|
|
165
|
+
const lineSplices = splices.get(index);
|
|
166
|
+
return lineSplices ? spliceLine(line, lineSplices) : line;
|
|
167
|
+
})
|
|
168
|
+
.join("\n");
|
|
169
|
+
};
|
|
170
|
+
};
|
package/src/ai/serializers.ts
CHANGED
|
@@ -8,7 +8,7 @@ import { openapiComponentSerializers } from "./openapi-components.ts";
|
|
|
8
8
|
* Every serializer a project brings to a downlevel pass, layered once for all
|
|
9
9
|
* the agent surfaces (`<route>.md`, llms-full.txt, the search and Ask AI
|
|
10
10
|
* corpora): the built-in families that read project data — examples, then the
|
|
11
|
-
* API reference — under the user's `
|
|
11
|
+
* API reference — under the user's `agents.markdownComponents`, which is spread
|
|
12
12
|
* last so an entry of the same name still wins. One layering, so a new family
|
|
13
13
|
* or a new surface cannot leave one consumer printing raw JSX.
|
|
14
14
|
*/
|
|
@@ -20,5 +20,5 @@ export const projectComponentSerializers = (
|
|
|
20
20
|
...openapiComponentSerializers(
|
|
21
21
|
project.sources.find(isOpenApiSource)?.openApiData() ?? {}
|
|
22
22
|
),
|
|
23
|
-
...project.config.
|
|
23
|
+
...project.config.agents.markdownComponents,
|
|
24
24
|
}) satisfies Record<string, ComponentMarkdown>;
|
package/src/ai/skills.ts
CHANGED
|
@@ -201,7 +201,7 @@ export const buildSkillsIndex = (
|
|
|
201
201
|
skills: readonly SkillArtifact[],
|
|
202
202
|
config: ResolvedConfig
|
|
203
203
|
): string => {
|
|
204
|
-
const deployBase = normalizeBasePath(config.deployment.base);
|
|
204
|
+
const deployBase = normalizeBasePath(config.deployment.options.base);
|
|
205
205
|
const index = {
|
|
206
206
|
$schema: AGENT_SKILLS_SCHEMA,
|
|
207
207
|
skills: skills.map((skill) => ({
|
package/src/ai/web-bot-auth.ts
CHANGED
|
@@ -4,7 +4,7 @@ import type { ResolvedConfig } from "../core/schema.ts";
|
|
|
4
4
|
* Web Bot Auth (IETF `webbotauth` WG): an org that runs agents publishes the
|
|
5
5
|
* agents' HTTP Message Signature public keys in a JWKS at a well-known path
|
|
6
6
|
* on its domain; sites receiving the signed requests fetch it to verify them.
|
|
7
|
-
* Blume publishes the directory from `
|
|
7
|
+
* Blume publishes the directory from `agents.webBotAuth.keys` — the schema admits
|
|
8
8
|
* public keys only, so the site can never leak signing credentials.
|
|
9
9
|
*/
|
|
10
10
|
|
|
@@ -22,7 +22,7 @@ export const SIGNATURES_DIRECTORY_TYPE =
|
|
|
22
22
|
export const buildSignaturesDirectory = (
|
|
23
23
|
config: ResolvedConfig
|
|
24
24
|
): string | null => {
|
|
25
|
-
const { keys } = config.
|
|
25
|
+
const { keys } = config.agents.webBotAuth;
|
|
26
26
|
if (keys.length === 0) {
|
|
27
27
|
return null;
|
|
28
28
|
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
import type { AdapterDescriptor } from "../core/adapter.ts";
|
|
4
|
+
import { adapterDescriptorSchema } from "../core/adapter.ts";
|
|
5
|
+
import type { HeadScript } from "./head.ts";
|
|
6
|
+
|
|
7
|
+
/** Options for {@link adobe}. */
|
|
8
|
+
export interface AdobeOptions {
|
|
9
|
+
/**
|
|
10
|
+
* The Launch (Adobe Experience Platform Tags) embed script URL for the
|
|
11
|
+
* environment to load, e.g. `https://assets.adobedtm.com/…/launch-….min.js`.
|
|
12
|
+
*/
|
|
13
|
+
url: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export const adobeOptionsSchema = z.strictObject({
|
|
17
|
+
url: z.string().min(1),
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
export type AdobeAdapter = AdapterDescriptor<"adobe", AdobeOptions>;
|
|
21
|
+
|
|
22
|
+
export const adobeAdapterSchema = adapterDescriptorSchema(
|
|
23
|
+
"adobe",
|
|
24
|
+
adobeOptionsSchema
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Adobe Analytics through a Launch property: Blume loads the environment's
|
|
29
|
+
* embed script, and the property's own rules decide what to track. Copy the
|
|
30
|
+
* URL from the environment's install instructions in Data Collection.
|
|
31
|
+
*/
|
|
32
|
+
export const adobe = (options: AdobeOptions): AdobeAdapter => ({
|
|
33
|
+
kind: "adobe",
|
|
34
|
+
options,
|
|
35
|
+
requiredSecrets: [],
|
|
36
|
+
runtimeDeps: [],
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* The async embed tag, as Launch's install instructions render it. Pageviews
|
|
41
|
+
* on client-router navigations are the property's business: give it a rule on
|
|
42
|
+
* history changes (or `_satellite.track` from a `script()` adapter).
|
|
43
|
+
*/
|
|
44
|
+
export const adobeHead = (options: AdobeOptions): HeadScript[] => [
|
|
45
|
+
{ attributes: { async: true, src: options.url }, content: null },
|
|
46
|
+
];
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
import type { AdapterDescriptor, JsonValue } from "../core/adapter.ts";
|
|
4
|
+
import { adapterDescriptorSchema } from "../core/adapter.ts";
|
|
5
|
+
import type { HeadScript } from "./head.ts";
|
|
6
|
+
import { inlineJson } from "./inline.ts";
|
|
7
|
+
|
|
8
|
+
/** The options {@link amplitude} maps itself. */
|
|
9
|
+
export interface AmplitudeNamedOptions {
|
|
10
|
+
/** Project API key. */
|
|
11
|
+
key: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Options for {@link amplitude}: the key plus any other Browser SDK
|
|
16
|
+
* `amplitude.init` option, forwarded verbatim (`serverZone`, `autocapture`,
|
|
17
|
+
* `defaultTracking`, …). JSON values only.
|
|
18
|
+
*/
|
|
19
|
+
export type AmplitudeOptions = AmplitudeNamedOptions & {
|
|
20
|
+
[option: string]: JsonValue;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export const amplitudeOptionsSchema = z
|
|
24
|
+
.object({
|
|
25
|
+
key: z.string().min(1),
|
|
26
|
+
})
|
|
27
|
+
.catchall(z.json());
|
|
28
|
+
|
|
29
|
+
export type AmplitudeAdapter = AdapterDescriptor<"amplitude", AmplitudeOptions>;
|
|
30
|
+
|
|
31
|
+
export const amplitudeAdapterSchema = adapterDescriptorSchema(
|
|
32
|
+
"amplitude",
|
|
33
|
+
amplitudeOptionsSchema
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Amplitude product analytics through the Browser SDK's script loader. The
|
|
38
|
+
* project API key is public — it's what every browser event carries.
|
|
39
|
+
*/
|
|
40
|
+
export const amplitude = (options: AmplitudeOptions): AmplitudeAdapter => ({
|
|
41
|
+
kind: "amplitude",
|
|
42
|
+
options,
|
|
43
|
+
requiredSecrets: [],
|
|
44
|
+
runtimeDeps: [],
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
/** The script loader's CDN; the key picks the bundle. */
|
|
48
|
+
export const AMPLITUDE_SCRIPT_ORIGIN = "https://cdn.amplitude.com/script/";
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* The init options the dashboard snippet ships with. `autocapture` covers page
|
|
52
|
+
* views, sessions, and history changes, so client-router navigations count
|
|
53
|
+
* without any extra hook; a passthrough option overrides either.
|
|
54
|
+
*/
|
|
55
|
+
export const AMPLITUDE_DEFAULT_INIT = {
|
|
56
|
+
autocapture: true,
|
|
57
|
+
fetchRemoteConfig: true,
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* The two tags from the dashboard's install snippet: the keyed SDK bundle
|
|
62
|
+
* (synchronous, so `window.amplitude` exists for the next tag) and the init
|
|
63
|
+
* call, with `key` mapped and everything else forwarded to `init` verbatim.
|
|
64
|
+
*/
|
|
65
|
+
export const amplitudeHead = (options: AmplitudeOptions): HeadScript[] => {
|
|
66
|
+
const { key, ...init } = options;
|
|
67
|
+
return [
|
|
68
|
+
{
|
|
69
|
+
attributes: {
|
|
70
|
+
src: `${AMPLITUDE_SCRIPT_ORIGIN}${encodeURIComponent(key)}.js`,
|
|
71
|
+
},
|
|
72
|
+
content: null,
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
attributes: {},
|
|
76
|
+
content: `window.amplitude.init(${inlineJson(key)},${inlineJson({ ...AMPLITUDE_DEFAULT_INIT, ...init })});`,
|
|
77
|
+
},
|
|
78
|
+
];
|
|
79
|
+
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
import type { AdapterDescriptor } from "../core/adapter.ts";
|
|
4
|
+
import { adapterDescriptorSchema } from "../core/adapter.ts";
|
|
5
|
+
import type { HeadScript } from "./head.ts";
|
|
6
|
+
import { inlineJson } from "./inline.ts";
|
|
7
|
+
|
|
8
|
+
/** Options for {@link clarity}. */
|
|
9
|
+
export interface ClarityOptions {
|
|
10
|
+
/** Project ID, from the project's tracking code in the Clarity dashboard. */
|
|
11
|
+
id: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const clarityOptionsSchema = z.strictObject({
|
|
15
|
+
id: z.string().min(1),
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
export type ClarityAdapter = AdapterDescriptor<"clarity", ClarityOptions>;
|
|
19
|
+
|
|
20
|
+
export const clarityAdapterSchema = adapterDescriptorSchema(
|
|
21
|
+
"clarity",
|
|
22
|
+
clarityOptionsSchema
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Microsoft Clarity session recordings and heatmaps. The project ID is public;
|
|
27
|
+
* it only picks the project the tag reports to.
|
|
28
|
+
*/
|
|
29
|
+
export const clarity = (options: ClarityOptions): ClarityAdapter => ({
|
|
30
|
+
kind: "clarity",
|
|
31
|
+
options,
|
|
32
|
+
requiredSecrets: [],
|
|
33
|
+
runtimeDeps: [],
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* The dashboard's tracking code: a `window.clarity` queue and the async tag
|
|
38
|
+
* load. Clarity follows history changes itself, so client-router navigations
|
|
39
|
+
* need no extra hook.
|
|
40
|
+
*/
|
|
41
|
+
export const clarityHead = (options: ClarityOptions): HeadScript[] => [
|
|
42
|
+
{
|
|
43
|
+
attributes: {},
|
|
44
|
+
content: `(function(c,l,a,r,i,t,y){c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)};t=l.createElement(r);t.async=1;t.src="https://www.clarity.ms/tag/"+i;y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y);})(window,document,"clarity","script",${inlineJson(encodeURIComponent(options.id))});`,
|
|
45
|
+
},
|
|
46
|
+
];
|