blume 2.0.3 → 2.1.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 +1 -0
- package/CHANGELOG.md +142 -0
- package/README.md +1 -1
- package/dist/cli/{chunk-5f86nr5m.js → chunk-073rdvgb.js} +21 -48
- package/dist/cli/{chunk-5f86nr5m.js.map → chunk-073rdvgb.js.map} +4 -5
- package/dist/cli/{chunk-ga0pf4aj.js → chunk-0n9xkp3d.js} +12 -3
- package/dist/cli/{chunk-ga0pf4aj.js.map → chunk-0n9xkp3d.js.map} +3 -3
- package/dist/cli/chunk-150jk7km.js +52 -0
- package/dist/cli/chunk-150jk7km.js.map +10 -0
- package/dist/cli/{chunk-9t7a85s3.js → chunk-313vnn40.js} +30 -19
- package/dist/cli/chunk-313vnn40.js.map +10 -0
- package/dist/cli/{chunk-tkacnehg.js → chunk-3v3ffbrj.js} +2 -2
- package/dist/cli/{chunk-q58y5e6a.js → chunk-3x6x3pph.js} +46 -24
- package/dist/cli/chunk-3x6x3pph.js.map +10 -0
- package/dist/cli/{chunk-1d7ve1dm.js → chunk-42t4jxdx.js} +37 -5
- package/dist/cli/chunk-42t4jxdx.js.map +12 -0
- package/dist/cli/{chunk-8ktnccpt.js → chunk-54ztw1nj.js} +21 -2
- package/dist/cli/chunk-54ztw1nj.js.map +10 -0
- package/dist/cli/{chunk-hm3vjy5s.js → chunk-5vjtgs6e.js} +28 -10
- package/dist/cli/{chunk-hm3vjy5s.js.map → chunk-5vjtgs6e.js.map} +4 -4
- package/dist/cli/chunk-66w9j7p6.js +322 -0
- package/dist/cli/chunk-66w9j7p6.js.map +14 -0
- package/dist/cli/{chunk-2hsdwb9n.js → chunk-7ppf1rva.js} +34 -18
- package/dist/cli/chunk-7ppf1rva.js.map +10 -0
- package/dist/cli/{chunk-r9rcc4w7.js → chunk-8y2kmjv8.js} +7 -7
- package/dist/cli/{chunk-r20tn01b.js → chunk-c1y538kd.js} +8 -2
- package/dist/cli/{chunk-r20tn01b.js.map → chunk-c1y538kd.js.map} +3 -3
- package/dist/cli/{chunk-2eytanqx.js → chunk-c887fj0s.js} +2 -2
- package/dist/cli/{chunk-p3v96n38.js → chunk-cfyg47zg.js} +16 -6
- package/dist/cli/chunk-cfyg47zg.js.map +10 -0
- package/dist/cli/chunk-cm89scdv.js +443 -0
- package/dist/cli/chunk-cm89scdv.js.map +11 -0
- package/dist/cli/{chunk-akbpwfxc.js → chunk-dzwehpy7.js} +2 -2
- package/dist/cli/{chunk-wrr3j9w9.js → chunk-e6atmn4h.js} +299 -72
- package/dist/cli/chunk-e6atmn4h.js.map +36 -0
- package/dist/cli/{chunk-tzmab476.js → chunk-e8xw9qkh.js} +8 -6
- package/dist/cli/{chunk-tzmab476.js.map → chunk-e8xw9qkh.js.map} +3 -3
- package/dist/cli/{chunk-6dsbexzp.js → chunk-e9q7a2ak.js} +17 -15
- package/dist/cli/{chunk-6dsbexzp.js.map → chunk-e9q7a2ak.js.map} +2 -2
- package/dist/cli/{chunk-pv29h0wf.js → chunk-ehweg4fr.js} +5155 -1249
- package/dist/cli/chunk-ehweg4fr.js.map +218 -0
- package/dist/cli/{chunk-c8chx29p.js → chunk-ep6nd0rn.js} +390 -318
- package/dist/cli/chunk-ep6nd0rn.js.map +36 -0
- package/dist/cli/{chunk-p73c0m7w.js → chunk-fdrkhpjy.js} +18 -15
- package/dist/cli/{chunk-p73c0m7w.js.map → chunk-fdrkhpjy.js.map} +3 -3
- package/dist/cli/{chunk-2z928egk.js → chunk-ft9vfys6.js} +5 -5
- package/dist/cli/{chunk-5m5nmvyq.js → chunk-gb420vvz.js} +316 -79
- package/dist/cli/chunk-gb420vvz.js.map +17 -0
- package/dist/cli/{chunk-vg9r4eb9.js → chunk-hebn0tpx.js} +86 -13
- package/dist/cli/chunk-hebn0tpx.js.map +14 -0
- package/dist/cli/{chunk-35d4wj9f.js → chunk-htrwgabr.js} +41 -23
- package/dist/cli/chunk-htrwgabr.js.map +15 -0
- package/dist/cli/{chunk-g4hq16wv.js → chunk-hx3xqnk9.js} +16 -14
- package/dist/cli/{chunk-g4hq16wv.js.map → chunk-hx3xqnk9.js.map} +2 -2
- package/dist/cli/chunk-j134vrp2.js +65 -0
- package/dist/cli/chunk-j134vrp2.js.map +10 -0
- package/dist/cli/{chunk-a58773jm.js → chunk-kma9f6sf.js} +2 -2
- package/dist/cli/chunk-kwrg63tm.js +31 -0
- package/dist/cli/chunk-kwrg63tm.js.map +10 -0
- package/dist/cli/{chunk-ey84smr6.js → chunk-mrcccgnh.js} +6 -6
- package/dist/cli/{chunk-ey84smr6.js.map → chunk-mrcccgnh.js.map} +1 -1
- package/dist/cli/{chunk-yfyb25rh.js → chunk-n0v7m8ry.js} +24 -8
- package/dist/cli/chunk-n0v7m8ry.js.map +14 -0
- package/dist/cli/{chunk-j85vccga.js → chunk-ncj7w596.js} +576 -367
- package/dist/cli/chunk-ncj7w596.js.map +35 -0
- package/dist/cli/{chunk-5xvm6tfj.js → chunk-nq1d20w2.js} +17 -15
- package/dist/cli/{chunk-5xvm6tfj.js.map → chunk-nq1d20w2.js.map} +2 -2
- package/dist/cli/{chunk-pehfxfta.js → chunk-nrns10mj.js} +6 -98
- package/dist/cli/chunk-nrns10mj.js.map +10 -0
- package/dist/cli/{chunk-crgn1q09.js → chunk-sds923fa.js} +4 -4
- package/dist/cli/chunk-t2m5j4pr.js +104 -0
- package/dist/cli/chunk-t2m5j4pr.js.map +11 -0
- package/dist/cli/{chunk-acanzt5p.js → chunk-tdqhyxfz.js} +6 -6
- package/dist/cli/chunk-tphac74f.js +126 -0
- package/dist/cli/chunk-tphac74f.js.map +11 -0
- package/dist/cli/chunk-w1r4vase.js +18 -0
- package/dist/cli/chunk-w1r4vase.js.map +10 -0
- package/dist/cli/{chunk-3em5wd2y.js → chunk-zccbjcj0.js} +4 -3
- package/dist/cli/{chunk-3em5wd2y.js.map → chunk-zccbjcj0.js.map} +2 -2
- package/dist/cli/index.js +31 -20
- package/dist/cli/index.js.map +5 -5
- package/dist/types/ai/agent-surface.d.ts +8 -7
- package/dist/types/ai/ai-catalog.d.ts +7 -0
- package/dist/types/ai/ask-context.d.ts +26 -0
- package/dist/types/ai/ask.d.ts +271 -58
- package/dist/types/ai/component-markdown.d.ts +2 -0
- package/dist/types/ai/index.d.ts +2 -2
- package/dist/types/ai/openapi-components.d.ts +4 -1
- package/dist/types/ai/site-skill.d.ts +26 -0
- package/dist/types/ai/skills.d.ts +16 -0
- package/dist/types/astro/integration.d.ts +9 -0
- package/dist/types/astro/markdown-negotiation.d.ts +3 -0
- package/dist/types/astro/pages.d.ts +10 -0
- package/dist/types/captcha/hcaptcha.d.ts +27 -0
- package/dist/types/captcha/index.d.ts +28 -0
- package/dist/types/captcha/schema.d.ts +29 -0
- package/dist/types/captcha/turnstile.d.ts +28 -0
- package/dist/types/cli/init/scaffold.d.ts +1 -1
- package/dist/types/components/content/api-field.d.ts +62 -0
- package/dist/types/components/content/api-page.d.ts +100 -0
- package/dist/types/components/layout/nav-utils.d.ts +26 -0
- package/dist/types/components/openapi/code-samples.d.ts +29 -0
- package/dist/types/components/openapi/helpers.d.ts +158 -0
- package/dist/types/components/openapi/security.d.ts +95 -0
- package/dist/types/components/openapi/snippets.d.ts +60 -0
- package/dist/types/consent/ethyca.d.ts +48 -0
- package/dist/types/consent/index.d.ts +37 -0
- package/dist/types/consent/native.d.ts +28 -0
- package/dist/types/consent/osano.d.ts +42 -0
- package/dist/types/consent/schema.d.ts +110 -0
- package/dist/types/core/changelog-index.d.ts +8 -0
- package/dist/types/core/config-input.d.ts +217 -23
- package/dist/types/core/data.d.ts +53 -4
- package/dist/types/core/footer.d.ts +8 -0
- package/dist/types/core/i18n-ui.d.ts +88 -0
- package/dist/types/core/includes.d.ts +8 -2
- package/dist/types/core/links.d.ts +8 -0
- package/dist/types/core/localizable.d.ts +7 -0
- package/dist/types/core/page-modes.d.ts +29 -0
- package/dist/types/core/probe.d.ts +2 -0
- package/dist/types/core/project-graph.d.ts +6 -0
- package/dist/types/core/redirect-patterns.d.ts +152 -0
- package/dist/types/core/related.d.ts +40 -0
- package/dist/types/core/schema.d.ts +670 -56
- package/dist/types/core/sources/cache.d.ts +3 -0
- package/dist/types/core/sources/contentful-rich-text.d.ts +11 -2
- package/dist/types/core/sources/contentful.d.ts +17 -1
- package/dist/types/core/sources/lexical.d.ts +5 -0
- package/dist/types/core/sources/normalize.d.ts +20 -1
- package/dist/types/core/sources/read.d.ts +5 -0
- package/dist/types/core/sources/remote.d.ts +37 -10
- package/dist/types/core/sources/sanity.d.ts +1 -1
- package/dist/types/core/types.d.ts +18 -1
- package/dist/types/core/variables.d.ts +42 -0
- package/dist/types/deploy/adapter-output.d.ts +2 -1
- package/dist/types/deploy/adapters/cloudflare.d.ts +7 -5
- package/dist/types/deploy/adapters/node.d.ts +58 -23
- package/dist/types/deploy/adapters/registry.d.ts +10 -0
- package/dist/types/deploy/adapters/types.d.ts +3 -2
- package/dist/types/deploy/node-headers.d.ts +13 -2
- package/dist/types/deploy/platforms/cloudflare.d.ts +15 -7
- package/dist/types/deploy/platforms/netlify.d.ts +7 -0
- package/dist/types/deploy/platforms/node.d.ts +3 -1
- package/dist/types/deploy/platforms/types.d.ts +18 -7
- package/dist/types/deploy/platforms/vercel.d.ts +26 -1
- package/dist/types/deploy/redirects.d.ts +55 -11
- package/dist/types/deploy/sitemap.d.ts +2 -1
- package/dist/types/deploy/vercel-negotiation.d.ts +51 -21
- package/dist/types/markdown/code-title.d.ts +17 -0
- package/dist/types/markdown/features.d.ts +3 -2
- package/dist/types/narration/build.d.ts +70 -0
- package/dist/types/narration/provider.d.ts +26 -0
- package/dist/types/narration/script.d.ts +154 -0
- package/dist/types/openapi/checks.d.ts +27 -0
- package/dist/types/openapi/graphql.d.ts +6 -0
- package/dist/types/openapi/model.d.ts +27 -10
- package/dist/types/openapi/overlay.d.ts +54 -0
- package/dist/types/openapi/parse.d.ts +16 -0
- package/dist/types/openapi/references.d.ts +30 -4
- package/dist/types/ratelimit/cloudflare.d.ts +39 -0
- package/dist/types/ratelimit/index.d.ts +27 -0
- package/dist/types/ratelimit/memory.d.ts +36 -0
- package/dist/types/ratelimit/schema.d.ts +119 -0
- package/dist/types/ratelimit/upstash.d.ts +46 -0
- package/dist/types/ratelimit/wrangler.d.ts +23 -0
- package/dist/types/reference/asyncapi.d.ts +10 -10
- package/dist/types/reference/graphql.d.ts +89 -11
- package/dist/types/reference/index.d.ts +1 -1
- package/dist/types/reference/openapi.d.ts +33 -12
- package/dist/types/reference/options.d.ts +82 -6
- package/dist/types/reference/scalar.d.ts +13 -0
- package/dist/types/reference/schema.d.ts +144 -36
- package/dist/types/search/adapters/registry.d.ts +3 -0
- package/dist/types/search/adapters/typesense.d.ts +14 -4
- package/dist/types/search/build.d.ts +3 -1
- package/dist/types/search/documents.d.ts +12 -1
- package/dist/types/search/orama-index.d.ts +13 -9
- package/dist/types/search/sync/algolia.d.ts +5 -2
- package/dist/types/search/sync/index.d.ts +3 -1
- package/dist/types/search/sync/typesense.d.ts +11 -7
- package/dist/types/seo/metatags.d.ts +20 -0
- package/dist/types/sources/contentful.d.ts +16 -0
- package/dist/types/sources/github-releases.d.ts +8 -1
- package/dist/types/sources/payload.d.ts +2 -0
- package/dist/types/sources/registry.d.ts +54 -0
- package/dist/types/sources/shared.d.ts +3 -0
- package/dist/types/sources/strapi.d.ts +2 -0
- package/docs/01-quickstart.mdx +4 -2
- package/docs/02-deployment.mdx +71 -17
- package/docs/03-upgrading.mdx +4 -4
- package/docs/04-migrating.mdx +1 -1
- package/docs/advanced/changelog.mdx +13 -2
- package/docs/advanced/skills.mdx +15 -1
- package/docs/cli/audit.mdx +51 -8
- package/docs/cli/doctor.mdx +5 -1
- package/docs/cli/evals.mdx +4 -4
- package/docs/cli/index.mdx +1 -0
- package/docs/cli/translate.mdx +1 -0
- package/docs/cli/validate.mdx +4 -3
- package/docs/configuration/analytics.mdx +3 -1
- package/docs/configuration/assistant.mdx +194 -38
- package/docs/configuration/consent.mdx +100 -0
- package/docs/configuration/customization.mdx +8 -6
- package/docs/configuration/export.mdx +5 -3
- package/docs/configuration/index.mdx +64 -5
- package/docs/configuration/meta.ts +3 -0
- package/docs/configuration/narration.mdx +119 -0
- package/docs/configuration/rate-limiting.mdx +90 -0
- package/docs/configuration/search.mdx +63 -12
- package/docs/configuration/theming.mdx +3 -1
- package/docs/content/components.mdx +108 -2
- package/docs/content/frontmatter.mdx +80 -2
- package/docs/content/i18n.mdx +39 -4
- package/docs/content/includes.mdx +16 -0
- package/docs/content/meta.mdx +1 -0
- package/docs/content/meta.ts +1 -0
- package/docs/content/navigation.mdx +32 -10
- package/docs/content/sources/contentful.mdx +35 -0
- package/docs/content/sources/custom.mdx +43 -0
- package/docs/content/sources/github-releases.mdx +39 -0
- package/docs/content/sources/index.mdx +91 -0
- package/docs/content/sources/meta.ts +16 -0
- package/docs/content/sources/notion.mdx +32 -0
- package/docs/content/sources/obsidian.mdx +37 -0
- package/docs/content/sources/payload.mdx +31 -0
- package/docs/content/sources/remote-mdx.mdx +44 -0
- package/docs/content/sources/sanity.mdx +29 -0
- package/docs/content/sources/strapi.mdx +32 -0
- package/docs/content/syntax.mdx +69 -4
- package/docs/content/variables.mdx +41 -0
- package/docs/discoverability/agent-discovery.mdx +29 -2
- package/docs/discoverability/index.mdx +2 -2
- package/docs/discoverability/json-api.mdx +2 -0
- package/docs/discoverability/llms-txt.mdx +2 -2
- package/docs/discoverability/markdown.mdx +3 -1
- package/docs/discoverability/mcp.mdx +4 -0
- package/docs/discoverability/metadata.mdx +17 -0
- package/docs/discoverability/sitemap-and-robots.mdx +1 -1
- package/docs/references/api-pages.mdx +74 -0
- package/docs/references/asyncapi.mdx +4 -2
- package/docs/references/graphql.mdx +14 -2
- package/docs/references/meta.ts +1 -1
- package/docs/references/openapi.mdx +148 -7
- package/docs/references/scalar.mdx +3 -1
- package/package.json +43 -8
- package/skills/blume/SKILL.md +3 -0
- package/skills/blume-migrate/SKILL.md +6 -6
- package/skills/blume-migrate/references/docusaurus.md +7 -7
- package/skills/blume-migrate/references/fumadocs.md +17 -13
- package/skills/blume-migrate/references/mintlify.md +37 -19
- package/skills/blume-migrate/references/nextra.md +10 -7
- package/skills/blume-migrate/references/starlight.md +11 -8
- package/skills/blume-migrate/scripts/mintlify-codemod.mjs +60 -14
- package/skills/blume-write-skill/SKILL.md +82 -0
- package/src/ai/agent-readability.ts +2 -1
- package/src/ai/agent-surface.ts +9 -7
- package/src/ai/ai-catalog.ts +6 -3
- package/src/ai/ask-context.ts +103 -20
- package/src/ai/ask-data.ts +6 -0
- package/src/ai/ask-limits.ts +13 -0
- package/src/ai/ask-tools.ts +142 -0
- package/src/ai/ask.ts +354 -76
- package/src/ai/changelog-markdown.ts +11 -6
- package/src/ai/component-markdown.ts +76 -1
- package/src/ai/cors.ts +14 -3
- package/src/ai/index.ts +12 -0
- package/src/ai/llms.ts +6 -2
- package/src/ai/markdown.ts +2 -1
- package/src/ai/mcp/data.ts +6 -0
- package/src/ai/mcp/query.ts +14 -6
- package/src/ai/openapi-components.ts +36 -6
- package/src/ai/relative-links.ts +4 -38
- package/src/ai/site-skill.ts +274 -0
- package/src/ai/skills.ts +35 -2
- package/src/ai/write-skill.ts +97 -0
- package/src/astro/generate.ts +210 -66
- package/src/astro/index.ts +1 -0
- package/src/astro/integration.ts +42 -4
- package/src/astro/markdown-negotiation.ts +3 -0
- package/src/astro/module-types.ts +9 -1
- package/src/astro/pages.ts +23 -0
- package/src/astro/templates.ts +406 -108
- package/src/astro/variables.ts +31 -0
- package/src/audit/catalog.ts +38 -3
- package/src/audit/checks/contrast.ts +183 -0
- package/src/audit/checks/i18n.ts +2 -3
- package/src/audit/checks/indexability.ts +2 -3
- package/src/audit/checks/links.ts +19 -13
- package/src/audit/checks/network.ts +110 -6
- package/src/audit/checks/redirects.ts +6 -4
- package/src/audit/checks/robots.ts +58 -2
- package/src/audit/checks/sitemap.ts +2 -3
- package/src/audit/redirects.ts +46 -15
- package/src/audit/run.ts +5 -0
- package/src/audit/types.ts +4 -1
- package/src/audit/url.ts +14 -5
- package/src/blume-modules.d.ts +12 -1
- package/src/captcha/client.ts +152 -0
- package/src/captcha/hcaptcha.ts +36 -0
- package/src/captcha/index.ts +28 -0
- package/src/captcha/schema.ts +32 -0
- package/src/captcha/turnstile.ts +38 -0
- package/src/captcha/verify.ts +71 -0
- package/src/cli/args.ts +51 -0
- package/src/cli/build-failure.ts +23 -0
- package/src/cli/command-meta.ts +5 -0
- package/src/cli/commands/audit.ts +10 -1
- package/src/cli/commands/dev.ts +18 -2
- package/src/cli/commands/doctor.ts +67 -28
- package/src/cli/commands/eval.ts +36 -4
- package/src/cli/commands/init.ts +6 -4
- package/src/cli/commands/skill.ts +96 -0
- package/src/cli/commands/validate.ts +10 -1
- package/src/cli/index.ts +5 -0
- package/src/cli/init/scaffold.ts +3 -3
- package/src/cli/prepare.ts +6 -3
- package/src/cli/required-secrets.ts +72 -30
- package/src/components/BlumePage.astro +2 -0
- package/src/components/content/ApiEndpoint.astro +18 -0
- package/src/components/content/ApiField.astro +79 -0
- package/src/components/content/ApiPlayground.astro +66 -0
- package/src/components/content/ApiRail.astro +19 -0
- package/src/components/content/Color.astro +1 -0
- package/src/components/content/FileTree.astro +1 -0
- package/src/components/content/GithubInfo.astro +1 -0
- package/src/components/content/Panel.astro +1 -0
- package/src/components/content/ParamField.astro +25 -0
- package/src/components/content/RequestExample.astro +17 -0
- package/src/components/content/ResponseExample.astro +17 -0
- package/src/components/content/ResponseField.astro +32 -0
- package/src/components/content/Step.astro +1 -0
- package/src/components/content/Tile.astro +1 -0
- package/src/components/content/Tooltip.astro +1 -0
- package/src/components/content/Tree.astro +1 -0
- package/src/components/content/TypeTable.astro +4 -1
- package/src/components/content/View.astro +21 -0
- package/src/components/content/ViewSwitcher.astro +168 -0
- package/src/components/content/api-field.ts +103 -0
- package/src/components/content/api-page.ts +248 -0
- package/src/components/content/mermaid-element.ts +15 -1
- package/src/components/content/view-switcher.ts +71 -0
- package/src/components/index.ts +2 -0
- package/src/components/islands/Assistant.astro +10 -1
- package/src/components/islands/assistant.tsx +104 -14
- package/src/components/islands/code-question.ts +62 -0
- package/src/components/islands/hooks.ts +136 -21
- package/src/components/islands/support-link.ts +68 -0
- package/src/components/layout/Analytics.astro +11 -2
- package/src/components/layout/Banner.astro +14 -10
- package/src/components/layout/Breadcrumbs.astro +6 -2
- package/src/components/layout/ConsentBanner.astro +62 -0
- package/src/components/layout/ConsentHead.astro +38 -0
- package/src/components/layout/Directory.astro +94 -0
- package/src/components/layout/DrawerSwitchers.astro +51 -0
- package/src/components/layout/Empty.astro +2 -2
- package/src/components/layout/Header.astro +122 -80
- package/src/components/layout/LanguageSwitcher.astro +48 -15
- package/src/components/layout/NarrationPlayer.astro +1085 -0
- package/src/components/layout/NavSelector.astro +33 -7
- package/src/components/layout/PageActions.astro +139 -24
- package/src/components/layout/PageFeedback.astro +54 -49
- package/src/components/layout/PageLayout.astro +71 -3
- package/src/components/layout/ReferenceLayout.astro +17 -6
- package/src/components/layout/RelatedPages.astro +42 -0
- package/src/components/layout/RootLayout.astro +318 -47
- package/src/components/layout/Search.astro +47 -19
- package/src/components/layout/SiteFooter.astro +124 -0
- package/src/components/layout/SiteMetatags.astro +16 -0
- package/src/components/layout/TableOfContents.astro +24 -17
- package/src/components/layout/consent/native.ts +79 -0
- package/src/components/layout/consent/types.ts +37 -0
- package/src/components/layout/footer-links.ts +53 -0
- package/src/components/layout/footer-socials.ts +87 -0
- package/src/components/layout/head-scripts.ts +6 -1
- package/src/components/layout/locale-redirect.ts +107 -0
- package/src/components/layout/nav-utils.ts +83 -0
- package/src/components/layout/page-feedback.ts +96 -0
- package/src/components/layout/search/algolia.ts +10 -1
- package/src/components/layout/search/analytics.ts +126 -0
- package/src/components/layout/search/endpoint.ts +48 -5
- package/src/components/layout/search/flexsearch.ts +17 -5
- package/src/components/layout/search/orama-cloud.ts +26 -14
- package/src/components/layout/search/pagefind.ts +114 -5
- package/src/components/layout/search/types.ts +32 -0
- package/src/components/layout/search/typesense.ts +19 -3
- package/src/components/openapi/AsyncApiOperation.astro +14 -7
- package/src/components/openapi/Authorization.astro +10 -0
- package/src/components/openapi/GraphqlOperation.astro +5 -0
- package/src/components/openapi/Operation.astro +184 -13
- package/src/components/openapi/ParametersTable.astro +8 -4
- package/src/components/openapi/Playground.astro +7 -1
- package/src/components/openapi/RequestBody.astro +24 -5
- package/src/components/openapi/RequestPanel.astro +59 -7
- package/src/components/openapi/Responses.astro +7 -4
- package/src/components/openapi/SchemaTable.astro +15 -3
- package/src/components/openapi/async-snippets.ts +65 -9
- package/src/components/openapi/async.ts +123 -29
- package/src/components/openapi/code-samples.ts +97 -0
- package/src/components/openapi/graphql-helpers.ts +35 -12
- package/src/components/openapi/helpers.ts +36 -2
- package/src/components/openapi/message-model.ts +54 -11
- package/src/components/openapi/message.ts +14 -4
- package/src/components/openapi/operation-model.ts +16 -7
- package/src/components/openapi/playground-client.ts +24 -5
- package/src/components/openapi/playground-schema.ts +1 -1
- package/src/components/openapi/schema-tree.ts +44 -14
- package/src/components/openapi/security.ts +16 -3
- package/src/components/openapi/snippets.ts +873 -10
- package/src/components/openapi/validate-json.ts +4 -3
- package/src/components/props.ts +6 -0
- package/src/consent/client.ts +95 -0
- package/src/consent/clients.ts +19 -0
- package/src/consent/ethyca.ts +71 -0
- package/src/consent/head.ts +24 -0
- package/src/consent/index.ts +37 -0
- package/src/consent/init.ts +29 -0
- package/src/consent/native.ts +36 -0
- package/src/consent/osano.ts +59 -0
- package/src/consent/schema.ts +30 -0
- package/src/core/builtin-tags.ts +5 -0
- package/src/core/changelog-index.ts +31 -1
- package/src/core/client-address.ts +19 -0
- package/src/core/component-diagnostics.ts +53 -0
- package/src/core/component-overrides.ts +32 -0
- package/src/core/config-input.ts +225 -23
- package/src/core/data.ts +46 -4
- package/src/core/diagnostics.ts +8 -2
- package/src/core/footer.ts +26 -0
- package/src/core/graph.ts +39 -36
- package/src/core/i18n-ui.ts +84 -2
- package/src/core/includes.ts +21 -4
- package/src/core/links.ts +63 -19
- package/src/core/localizable.ts +26 -0
- package/src/core/navigation.ts +43 -12
- package/src/core/page-modes.ts +56 -0
- package/src/core/probe.ts +26 -6
- package/src/core/project-graph.ts +163 -16
- package/src/core/redirect-patterns.ts +520 -0
- package/src/core/related.ts +131 -0
- package/src/core/schema.ts +339 -66
- package/src/core/sources/cache.ts +6 -0
- package/src/core/sources/contentful-rich-text.ts +29 -6
- package/src/core/sources/contentful.ts +135 -25
- package/src/core/sources/filesystem.ts +26 -4
- package/src/core/sources/github-releases.ts +12 -1
- package/src/core/sources/lexical.ts +15 -10
- package/src/core/sources/mdx-remote.ts +62 -10
- package/src/core/sources/normalize.ts +228 -41
- package/src/core/sources/notion.ts +7 -1
- package/src/core/sources/obsidian.ts +16 -3
- package/src/core/sources/payload.ts +38 -15
- package/src/core/sources/read.ts +8 -3
- package/src/core/sources/remote.ts +72 -15
- package/src/core/sources/resolve.ts +11 -1
- package/src/core/sources/sanity.ts +43 -25
- package/src/core/sources/strapi.ts +2 -2
- package/src/core/types.ts +19 -1
- package/src/core/ui-packs/ar.ts +44 -0
- package/src/core/ui-packs/bg.ts +46 -0
- package/src/core/ui-packs/bn.ts +44 -0
- package/src/core/ui-packs/ca.ts +47 -0
- package/src/core/ui-packs/cs.ts +45 -0
- package/src/core/ui-packs/da.ts +46 -0
- package/src/core/ui-packs/de.ts +47 -0
- package/src/core/ui-packs/el.ts +46 -0
- package/src/core/ui-packs/es.ts +47 -0
- package/src/core/ui-packs/fa.ts +46 -0
- package/src/core/ui-packs/fi.ts +46 -0
- package/src/core/ui-packs/fr.ts +47 -0
- package/src/core/ui-packs/he.ts +44 -0
- package/src/core/ui-packs/hi.ts +45 -0
- package/src/core/ui-packs/hr.ts +46 -0
- package/src/core/ui-packs/hu.ts +45 -0
- package/src/core/ui-packs/id.ts +46 -0
- package/src/core/ui-packs/it.ts +46 -0
- package/src/core/ui-packs/ja.ts +46 -0
- package/src/core/ui-packs/ko.ts +45 -0
- package/src/core/ui-packs/nl.ts +47 -0
- package/src/core/ui-packs/no.ts +45 -0
- package/src/core/ui-packs/pl.ts +46 -0
- package/src/core/ui-packs/pt-br.ts +47 -0
- package/src/core/ui-packs/pt.ts +46 -0
- package/src/core/ui-packs/ro.ts +46 -0
- package/src/core/ui-packs/ru.ts +46 -0
- package/src/core/ui-packs/sk.ts +45 -0
- package/src/core/ui-packs/sr.ts +46 -0
- package/src/core/ui-packs/sv.ts +45 -0
- package/src/core/ui-packs/th.ts +44 -0
- package/src/core/ui-packs/tr.ts +46 -0
- package/src/core/ui-packs/uk.ts +46 -0
- package/src/core/ui-packs/vi.ts +46 -0
- package/src/core/ui-packs/zh-tw.ts +44 -0
- package/src/core/ui-packs/zh.ts +44 -0
- package/src/core/variables.ts +103 -0
- package/src/deploy/adapter-output.ts +7 -2
- package/src/deploy/adapters/cloudflare.ts +7 -5
- package/src/deploy/adapters/node.ts +47 -9
- package/src/deploy/adapters/types.ts +7 -3
- package/src/deploy/artifacts.ts +79 -9
- package/src/deploy/cloudflare-negotiation.ts +35 -5
- package/src/deploy/headers.ts +2 -1
- package/src/deploy/node-headers.ts +63 -9
- package/src/deploy/platforms/cloudflare.ts +45 -9
- package/src/deploy/platforms/netlify.ts +35 -2
- package/src/deploy/platforms/node.ts +12 -2
- package/src/deploy/platforms/types.ts +21 -7
- package/src/deploy/platforms/vercel.ts +149 -17
- package/src/deploy/redirects.ts +151 -24
- package/src/deploy/rss.ts +3 -1
- package/src/deploy/sitemap.ts +39 -5
- package/src/deploy/vercel-negotiation.ts +326 -102
- package/src/eval/agents.ts +18 -1
- package/src/eval/prompts.ts +6 -3
- package/src/eval/report.ts +34 -13
- package/src/eval/run.ts +5 -0
- package/src/markdown/api-rail.ts +259 -0
- package/src/markdown/code-title.ts +35 -9
- package/src/markdown/features.ts +3 -2
- package/src/markdown/fence-meta.ts +2 -0
- package/src/markdown/include.ts +11 -1
- package/src/markdown/index.ts +28 -5
- package/src/markdown/math.ts +4 -4
- package/src/markdown/relative-links.ts +3 -2
- package/src/markdown/variables.ts +56 -0
- package/src/markdown/views.ts +82 -0
- package/src/narration/build.ts +412 -0
- package/src/narration/player.ts +249 -0
- package/src/narration/provider.ts +29 -0
- package/src/narration/script.ts +592 -0
- package/src/og/card.ts +7 -6
- package/src/openapi/checks.ts +273 -0
- package/src/openapi/graphql-build.ts +21 -0
- package/src/openapi/graphql.ts +11 -0
- package/src/openapi/model.ts +72 -27
- package/src/openapi/overlay.ts +256 -0
- package/src/openapi/parse.ts +182 -4
- package/src/openapi/references.ts +64 -8
- package/src/openapi/render-mdx.ts +5 -1
- package/src/openapi/scalar.ts +40 -6
- package/src/openapi/source.ts +40 -15
- package/src/ratelimit/cloudflare.ts +54 -0
- package/src/ratelimit/index.ts +30 -0
- package/src/ratelimit/memory.ts +45 -0
- package/src/ratelimit/runtime.ts +247 -0
- package/src/ratelimit/schema.ts +28 -0
- package/src/ratelimit/upstash.ts +60 -0
- package/src/ratelimit/wrangler.ts +70 -0
- package/src/reference/asyncapi.ts +2 -2
- package/src/reference/graphql.ts +20 -3
- package/src/reference/index.ts +1 -0
- package/src/reference/openapi.ts +21 -7
- package/src/reference/options.ts +80 -8
- package/src/reference/scalar.ts +33 -8
- package/src/registry/eject.ts +23 -5
- package/src/registry/registry.ts +7 -0
- package/src/search/adapters/locale-scope.ts +30 -0
- package/src/search/adapters/typesense.ts +14 -4
- package/src/search/build.ts +21 -3
- package/src/search/documents.ts +26 -2
- package/src/search/orama-index.ts +191 -34
- package/src/search/pagefind-ranking.ts +39 -0
- package/src/search/source-pages.ts +29 -0
- package/src/search/sync/algolia.ts +111 -10
- package/src/search/sync/index.ts +52 -13
- package/src/search/sync/orama-cloud.ts +3 -0
- package/src/search/sync/typesense.ts +76 -26
- package/src/seo/metatags.ts +67 -0
- package/src/sources/contentful.ts +12 -0
- package/src/sources/github-releases.ts +7 -1
- package/src/sources/shared.ts +3 -0
- package/src/theme/chrome-icons.ts +1 -0
- package/src/theme/color.ts +500 -0
- package/src/theme/entry.ts +85 -6
- package/src/theme/palette.ts +121 -45
- package/src/translate/prompts.ts +1 -0
- package/src/translate/validate.ts +31 -3
- package/src/upgrade/upgrade.ts +4 -171
- package/dist/cli/chunk-1d7ve1dm.js.map +0 -12
- package/dist/cli/chunk-2hsdwb9n.js.map +0 -10
- package/dist/cli/chunk-35d4wj9f.js.map +0 -15
- package/dist/cli/chunk-364znk6q.js +0 -75
- package/dist/cli/chunk-364znk6q.js.map +0 -11
- package/dist/cli/chunk-5m5nmvyq.js.map +0 -13
- package/dist/cli/chunk-8ktnccpt.js.map +0 -10
- package/dist/cli/chunk-9t7a85s3.js.map +0 -10
- package/dist/cli/chunk-b07cmahc.js +0 -145
- package/dist/cli/chunk-b07cmahc.js.map +0 -11
- package/dist/cli/chunk-c8chx29p.js.map +0 -36
- package/dist/cli/chunk-e04dxsz1.js +0 -39
- package/dist/cli/chunk-e04dxsz1.js.map +0 -10
- package/dist/cli/chunk-j85vccga.js.map +0 -36
- package/dist/cli/chunk-p3v96n38.js.map +0 -10
- package/dist/cli/chunk-pehfxfta.js.map +0 -10
- package/dist/cli/chunk-pv29h0wf.js.map +0 -190
- package/dist/cli/chunk-q58y5e6a.js.map +0 -10
- package/dist/cli/chunk-vg9r4eb9.js.map +0 -14
- package/dist/cli/chunk-wrr3j9w9.js.map +0 -35
- package/dist/cli/chunk-yfyb25rh.js.map +0 -14
- package/docs/content/sources.mdx +0 -334
- /package/dist/cli/{chunk-tkacnehg.js.map → chunk-3v3ffbrj.js.map} +0 -0
- /package/dist/cli/{chunk-r9rcc4w7.js.map → chunk-8y2kmjv8.js.map} +0 -0
- /package/dist/cli/{chunk-2eytanqx.js.map → chunk-c887fj0s.js.map} +0 -0
- /package/dist/cli/{chunk-akbpwfxc.js.map → chunk-dzwehpy7.js.map} +0 -0
- /package/dist/cli/{chunk-2z928egk.js.map → chunk-ft9vfys6.js.map} +0 -0
- /package/dist/cli/{chunk-a58773jm.js.map → chunk-kma9f6sf.js.map} +0 -0
- /package/dist/cli/{chunk-crgn1q09.js.map → chunk-sds923fa.js.map} +0 -0
- /package/dist/cli/{chunk-acanzt5p.js.map → chunk-tdqhyxfz.js.map} +0 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/ai/site-skill.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import { hasGeneratedChangelog } from \"../astro/pages.ts\";\nimport {\n mountBasePath,\n normalizeBasePath,\n withBasePath,\n} from \"../core/base-path.ts\";\nimport { CHANGELOG_INDEX_ROUTE } from \"../core/changelog-index.ts\";\nimport { discoverPagesSync } from \"../core/custom-pages.ts\";\nimport type { BlumeProject } from \"../core/project-graph.ts\";\nimport { absoluteUrl } from \"../core/site-url.ts\";\nimport type { NavNode, PageRecord } from \"../core/types.ts\";\nimport { resolveReferences } from \"../openapi/references.ts\";\nimport { docsPhrase } from \"./ai-catalog.ts\";\nimport { API_PAGES_PATH } from \"./api/paths.ts\";\nimport { asciiSlugify } from \"./mcp/discovery.ts\";\nimport {\n SKILL_DESCRIPTION_MAX,\n generatesSiteSkill,\n skillMdArtifact,\n} from \"./skills.ts\";\nimport type { SkillArtifact } from \"./skills.ts\";\n\n/**\n * The site's own agent skill (`agents.skillMd`): a `SKILL.md` in the Agent\n * Skills format, built from what the build already knows — the site's title\n * and description, how to read any page as Markdown, llms.txt and the MCP\n * server, the API references, and a map of the docs with each page's one-line\n * description. No model writes it, so it costs nothing and is current with\n * every build: a guide to the docs rather than a summary of the product. A\n * hand-written skill of the same name in `agents.skills` replaces it.\n */\n\n/** The most pages the map lists; llms.txt holds the rest. */\nexport const MAX_SKILL_PAGES = 200;\n\n/** The Agent Skills spec caps a skill name at 64 characters. */\nconst NAME_MAX = 64;\n\n/** Where the site skill is served besides the discovery index. */\nexport const SKILL_MD_PATH = \"/skill.md\";\n\n/**\n * The site skill's name: the title as a skill name (lowercase alphanumerics\n * and single hyphens), else the site's host, for a title with no Latin\n * letters in it.\n */\nexport const siteSkillName = (project: BlumeProject): string => {\n const { site } = project.config.deployment.options;\n const fromTitle = asciiSlugify(project.config.title);\n const name =\n fromTitle || asciiSlugify(site ? new URL(site).hostname : \"\") || \"docs\";\n return name.slice(0, NAME_MAX).replace(/-+$/u, \"\");\n};\n\n/** A title as Markdown link text (brackets escaped, as in llms.txt). */\nconst linkText = (title: string): string =>\n title.replaceAll(/[\\\\[\\]]/gu, String.raw`\\$&`);\n\n/**\n * Current-version, default-locale pages worth listing: not API operations,\n * and not changelog entries, which the changelog index covers in one line.\n */\nconst mappedPages = (project: BlumeProject): PageRecord[] => {\n const defaultLocale = project.config.i18n?.defaultLocale;\n return project.graph.pages.filter(\n (page) =>\n !(\n page.meta.ai.exclude ||\n page.meta.draft ||\n page.meta.sidebar.hidden ||\n page.meta.seo.noindex ||\n page.version !== \"\" ||\n page.source.name === \"openapi\" ||\n page.contentType === \"changelog\"\n ) &&\n (defaultLocale === undefined || page.locale === defaultLocale)\n );\n};\n\n/** Renders the page map, listing each page once, up to the cap. */\nclass PageMap {\n readonly #byRoute: Map<string, PageRecord>;\n readonly #listed = new Set<string>();\n readonly #url: (route: string) => string;\n\n constructor(pages: PageRecord[], url: (route: string) => string) {\n this.#byRoute = new Map(pages.map((page) => [page.route, page]));\n this.#url = url;\n }\n\n /** How many listable pages the cap left out. */\n get omitted(): number {\n return this.#byRoute.size - this.#listed.size;\n }\n\n /** The Markdown link line for a route, or nothing when it isn't listed. */\n line(route: string): string[] {\n const page = this.#byRoute.get(route);\n if (\n !page ||\n this.#listed.has(route) ||\n this.#listed.size >= MAX_SKILL_PAGES\n ) {\n return [];\n }\n this.#listed.add(route);\n const summary = page.description ? `: ${page.description}` : \"\";\n return [`- [${linkText(page.title)}](${this.#url(route)})${summary}`];\n }\n\n /** One navigation level: its loose pages, then each group under a heading. */\n level(nodes: NavNode[], depth: number): string[] {\n const list: string[] = [];\n const groups: string[] = [];\n for (const node of nodes) {\n if (node.kind === \"page\") {\n list.push(...this.line(node.route));\n continue;\n }\n const blocks = [\n ...(node.route ? this.line(node.route) : []),\n ...this.level(node.children, depth + 1),\n ];\n if (blocks.length > 0) {\n groups.push(\n \"\",\n `${\"#\".repeat(Math.min(depth, 6))} ${node.label}`,\n \"\",\n ...blocks\n );\n }\n }\n return [...list, ...groups];\n }\n\n /** Pages the navigation doesn't reach, in route order. */\n rest(): string[] {\n return [...this.#byRoute.keys()]\n .toSorted((a, b) => a.localeCompare(b))\n .flatMap((route) => this.line(route));\n }\n}\n\n/** The \"Reading the docs\" bullets: every agent surface the site serves. */\nconst surfaceLines = (\n project: BlumeProject,\n url: (path: string) => string\n): string[] => {\n const { agents } = project.config;\n const lines = [\n `- Any page as Markdown: add \\`.md\\` to its URL (the home page is ${url(\"/index.md\")}). Every page link below already points at the Markdown.`,\n ];\n if (agents.llmsTxt.enabled) {\n lines.push(\n `- [llms.txt](${url(\"/llms.txt\")}): every page with a one-line summary.`,\n `- [llms-full.txt](${url(\"/llms-full.txt\")}): every page in one file, for when you need all of it.`\n );\n }\n if (agents.mcp.enabled) {\n lines.push(\n `- MCP server at ${url(agents.mcp.route)}, with \\`search_docs\\`, \\`get_page\\`, \\`list_pages\\`, and \\`get_navigation\\`. Connect it to search the docs instead of guessing URLs.`\n );\n }\n if (agents.api) {\n lines.push(\n `- [JSON API](${url(API_PAGES_PATH)}): the page index, with each page as JSON and Markdown.`\n );\n }\n const userPages = project.context.pagesRoot\n ? discoverPagesSync(project.context.pagesRoot)\n : [];\n if (hasGeneratedChangelog(project, userPages)) {\n lines.push(\n `- [Changelog](${url(`${CHANGELOG_INDEX_ROUTE}.md`)}): release notes, newest first.`\n );\n }\n return lines;\n};\n\n/** The \"API reference\" bullets, one per rendered reference. */\nconst referenceLines = (\n project: BlumeProject,\n url: (path: string) => string\n): string[] =>\n resolveReferences(project.config).map((reference) => {\n // Scalar renders its own page with no Markdown mirror; Blume-rendered\n // references are pages like any other, one per operation.\n const route =\n reference.kind === \"scalar\"\n ? reference.route\n : withBasePath(reference.basePath, reference.route);\n const pages =\n reference.kind === \"scalar\"\n ? \"\"\n : \", with a page per operation (add `.md` for its Markdown)\";\n return `- [${linkText(reference.label)}](${url(route)})${pages}.`;\n });\n\n/** The skill's frontmatter `description`: what it's for and when to use it. */\nconst skillDescription = (project: BlumeProject): string => {\n const { description, title } = project.config;\n const summary = description ? ` ${description.trim()}` : \"\";\n return `Read ${docsPhrase(title, \"docs\")} instead of answering from memory.${summary} Use when a task involves ${title}: how it works, how to set it up or configure it, or its API.`.slice(\n 0,\n SKILL_DESCRIPTION_MAX\n );\n};\n\n/** The site skill's `SKILL.md`. */\nconst skillMarkdown = (project: BlumeProject, name: string): string => {\n const { config } = project;\n const { site = \"\" } = config.deployment.options;\n const base = normalizeBasePath(config.deployment.options.base);\n // Mounted and encoded like llms.txt's links.\n const url = (path: string): string =>\n encodeURI(absoluteUrl(site, mountBasePath(base, path)));\n const markdownUrl = (route: string): string =>\n url(route === \"/\" ? \"/index.md\" : `${route}.md`);\n\n const map = new PageMap(mappedPages(project), markdownUrl);\n const pages = [\n ...map.level(project.graph.navigation.sidebar, 3),\n ...map.rest(),\n ];\n const { omitted } = map;\n if (omitted > 0) {\n pages.push(\n \"\",\n config.agents.llmsTxt.enabled\n ? `…and ${omitted} more. [llms.txt](${url(\"/llms.txt\")}) lists every page.`\n : `…and ${omitted} more.`\n );\n }\n const references = referenceLines(project, url);\n\n return [\n \"---\",\n `name: ${name}`,\n `description: ${JSON.stringify(skillDescription(project))}`,\n \"---\",\n \"\",\n `# ${config.title}`,\n \"\",\n ...(config.description ? [config.description.trim(), \"\"] : []),\n `This skill points you at ${docsPhrase(config.title, \"docs\")}, at ${url(\"/\")}. When a task involves ${config.title}, read the relevant page before relying on what you remember: the docs are the source of truth, and they change.`,\n \"\",\n \"## Reading the docs\",\n \"\",\n ...surfaceLines(project, url),\n ...(references.length > 0\n ? [\"\", \"## API reference\", \"\", ...references]\n : []),\n ...(pages.length > 0 ? [\"\", \"## Pages\", \"\", ...pages] : []),\n \"\",\n ]\n .join(\"\\n\")\n .replaceAll(/\\n{3,}/gu, \"\\n\\n\");\n};\n\n/**\n * The generated site skill, or `null` when `agents.skillMd` is off or there\n * is no `deployment.site` to make its links absolute.\n */\nexport const buildSiteSkill = (project: BlumeProject): SkillArtifact | null => {\n if (!generatesSiteSkill(project.config)) {\n return null;\n }\n const name = siteSkillName(project);\n return skillMdArtifact(\n name,\n skillDescription(project),\n skillMarkdown(project, name)\n );\n};\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";;;;;;AAoCA,IAAM,WAAW;AAUV,IAAM,gBAAgB,CAAC,YAAkC;AAAA,EAC9D,QAAQ,SAAS,QAAQ,OAAO,WAAW;AAAA,EAC3C,MAAM,YAAY,aAAa,QAAQ,OAAO,KAAK;AAAA,EACnD,MAAM,OACJ,aAAa,aAAa,OAAO,IAAI,IAAI,IAAI,EAAE,WAAW,EAAE,KAAK;AAAA,EACnE,OAAO,KAAK,MAAM,GAAG,QAAQ,EAAE,QAAQ,QAAQ,EAAE;AAAA;",
|
|
8
|
+
"debugId": "D5EE89A8D7931D3164756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -37,6 +37,7 @@ var normalizeRoute = (input) => {
|
|
|
37
37
|
return trimmed.startsWith("/") ? trimmed : `/${trimmed}`;
|
|
38
38
|
};
|
|
39
39
|
var isInternalPath = (target) => target.startsWith("/") && !target.startsWith("//");
|
|
40
|
+
var isExternalUrl = (target) => /^https?:\/\//iu.test(target) || target.startsWith("//");
|
|
40
41
|
var pathPart = (target) => {
|
|
41
42
|
const at = target.search(/[#?]/u);
|
|
42
43
|
return at === -1 ? target : target.slice(0, at);
|
|
@@ -119,7 +120,7 @@ var MCP_TOOLS = [
|
|
|
119
120
|
}
|
|
120
121
|
];
|
|
121
122
|
|
|
122
|
-
export { trimEnd, trimChar, normalizeBasePath, normalizePath, normalizeRoute, isInternalPath, withBasePath, mountBasePath, withComposedBasePath, withAuthoredBasePath, stripBasePath, siteRoot, absoluteUrl2, MCP_TOOLS };
|
|
123
|
+
export { trimEnd, trimChar, normalizeBasePath, normalizePath, normalizeRoute, isInternalPath, isExternalUrl, withBasePath, mountBasePath, withComposedBasePath, withAuthoredBasePath, stripBasePath, siteRoot, absoluteUrl2, MCP_TOOLS };
|
|
123
124
|
|
|
124
|
-
//# debugId=
|
|
125
|
-
//# sourceMappingURL=chunk-
|
|
125
|
+
//# debugId=F5565EEFC776A07C64756E2164756E21
|
|
126
|
+
//# sourceMappingURL=chunk-zccbjcj0.js.map
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"import { joinURL } from \"ufo\";\n\nimport { trimEnd } from \"./trim.ts\";\n\n/**\n * Absolute-URL building for the configured `deployment.site`, shared by every\n * emitter that prints site URLs (sitemap, RSS, robots, llms.txt, the MCP and\n * agent-discovery documents). One implementation replaces eight per-file\n * copies that had drifted across three different trailing-slash treatments.\n *\n * Deliberately not `new URL(path, site)`: a root-absolute path would drop the\n * base path of a subpath deployment (`acme.com/docs`). ufo's `joinURL` joins\n * without that footgun; the site is first trimmed with the ReDoS-safe\n * `trimEnd` loop so even a malformed `site` with piled-up trailing slashes\n * joins cleanly.\n */\n\n/** The configured site with any trailing slashes dropped. */\nexport const siteRoot = (site: string): string => trimEnd(site, \"/\");\n\n/** `site` + root-absolute `path` (already carrying any deployment base). */\nexport const absoluteUrl = (site: string, path: string): string => {\n const root = siteRoot(site);\n // joinURL folds a lone \"/\" away entirely; the homepage keeps its slash\n // (`https://example.com/`), matching what every emitter always printed.\n return path === \"/\" ? `${root}/` : joinURL(root, path);\n};\n",
|
|
8
8
|
"/**\n * Static metadata for the MCP tools Blume exposes. Shared by the server (which\n * pairs each entry with a Zod input schema and handler) and the `.well-known`\n * discovery documents, so tool names and descriptions never drift between the\n * live server and its advertised capabilities.\n */\n\n/** A read-only, non-mutating tool hint set (every Blume tool is read-only). */\nconst READ_ONLY = { openWorldHint: false, readOnlyHint: true } as const;\n\nexport interface McpToolMeta {\n annotations: { openWorldHint: boolean; readOnlyHint: boolean };\n description: string;\n name: string;\n title: string;\n}\n\nexport const MCP_TOOLS: McpToolMeta[] = [\n {\n annotations: READ_ONLY,\n description:\n 'Full-text search across the documentation. Returns matching pages with their title, route, content type, and a short excerpt; pass `contentTypes` to search only pages of certain types (e.g. `rfc`, `changelog`), `filters` to require facet values the site declares per type (e.g. `{\"status\": \"enforced\"}`), and `locale` to search one language. On a versioned site results default to the current docs — pass `version` to search an archived version (e.g. `\"v1.0\"`) or `\"all\"` for every version. Use this first to discover relevant pages, then `get_page` to read one in full.',\n name: \"search_docs\",\n title: \"Search documentation\",\n },\n {\n annotations: READ_ONLY,\n description:\n \"Fetch a single documentation page as agent-optimized Markdown (frontmatter included, components downleveled to plain Markdown). Pass a route from `search_docs` or `list_pages`, e.g. `/guides/install`.\",\n name: \"get_page\",\n title: \"Get page Markdown\",\n },\n {\n annotations: READ_ONLY,\n description:\n 'List every documentation page with its route, title, description, content type, and any declared facet values; pass `contentTypes`, `filters`, and/or `locale` to narrow the list. On a versioned site the list defaults to the current docs — pass `version` for an archived version or `\"all\"`. Useful for enumerating the docs, discovering the types and facets in use, or finding a page when search is too narrow.',\n name: \"list_pages\",\n title: \"List pages\",\n },\n {\n annotations: READ_ONLY,\n description:\n \"Return the documentation navigation tree (header tabs and the sidebar hierarchy), reflecting how the docs are organized for readers. Pass `locale` for a language's tree and, on a versioned site, `version` for an archived snapshot's tree.\",\n name: \"get_navigation\",\n title: \"Get navigation\",\n },\n];\n"
|
|
9
9
|
],
|
|
10
|
-
"mappings": ";;;AAYO,IAAM,YAAY,CAAC,MAAc,SAAyB;AAAA,EAC/D,IAAI,QAAQ;AAAA,EACZ,OAAO,QAAQ,KAAK,UAAU,KAAK,WAAW,MAAM;AAAA,IAClD,SAAS;AAAA,EACX;AAAA,EACA,OAAO,KAAK,MAAM,KAAK;AAAA;AAIlB,IAAM,UAAU,CAAC,MAAc,SAAyB;AAAA,EAC7D,IAAI,MAAM,KAAK;AAAA,EACf,OAAO,MAAM,KAAK,KAAK,MAAM,OAAO,MAAM;AAAA,IACxC,OAAO;AAAA,EACT;AAAA,EACA,OAAO,KAAK,MAAM,GAAG,GAAG;AAAA;AAInB,IAAM,WAAW,CAAC,MAAc,SACrC,QAAQ,UAAU,MAAM,IAAI,GAAG,IAAI;;;ACV9B,IAAM,oBAAoB,CAAC,UAA2B;AAAA,EAC3D,IAAI,CAAC,OAAO;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EAIA,MAAM,UAAU,MAAM,KAAK,EAAE,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,EAChE,OAAO,YAAY,KAAK,KAAK,IAAI;AAAA;AAO5B,IAAM,gBAAgB,CAAC,SAAyB;AAAA,EACrD,MAAM,UAAU,QAAQ,MAAM,GAAG;AAAA,EACjC,OAAO,YAAY,KAAK,MAAM;AAAA;AAUzB,IAAM,iBAAiB,CAAC,UAA0B;AAAA,EACvD,MAAM,UAAU,QAAQ,MAAM,KAAK,GAAG,GAAG;AAAA,EACzC,IAAI,YAAY,IAAI;AAAA,IAClB,OAAO;AAAA,EACT;AAAA,EACA,OAAO,QAAQ,WAAW,GAAG,IAAI,UAAU,IAAI;AAAA;AAQ1C,IAAM,iBAAiB,CAAC,WAC7B,OAAO,WAAW,GAAG,KAAK,CAAC,OAAO,WAAW,IAAI;
|
|
11
|
-
"debugId": "
|
|
10
|
+
"mappings": "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",
|
|
11
|
+
"debugId": "F5565EEFC776A07C64756E2164756E21",
|
|
12
12
|
"names": []
|
|
13
13
|
}
|
package/dist/cli/index.js
CHANGED
|
@@ -87,6 +87,10 @@ var commandMeta = {
|
|
|
87
87
|
description: "Preview the last production build.",
|
|
88
88
|
name: "preview"
|
|
89
89
|
},
|
|
90
|
+
skill: {
|
|
91
|
+
description: "Write the docs site's agent skill with a coding agent, in place of the generated one.",
|
|
92
|
+
name: "skill"
|
|
93
|
+
},
|
|
90
94
|
sync: {
|
|
91
95
|
description: "Re-fetch remote content sources and regenerate the runtime.",
|
|
92
96
|
name: "sync"
|
|
@@ -190,6 +194,7 @@ var DOCS_BASE = "https://useblume.dev";
|
|
|
190
194
|
var DOCS_DEPLOYMENT = "/docs/deployment";
|
|
191
195
|
var DOCS_CLI_VALIDATE = "/docs/cli/validate";
|
|
192
196
|
var DOCS_CONTENT_SOURCES = "/docs/content/sources";
|
|
197
|
+
var DOCS_CONTENT_SOURCES_OBSIDIAN = "/docs/content/sources/obsidian";
|
|
193
198
|
var DOCS_CONTENT_NAVIGATION = "/docs/content/navigation";
|
|
194
199
|
var DOCS_CONTENT_INCLUDES = "/docs/content/includes";
|
|
195
200
|
var DOCS_PATHS = new Map(Object.entries({
|
|
@@ -207,6 +212,7 @@ var DOCS_PATHS = new Map(Object.entries({
|
|
|
207
212
|
BLUME_DEPENDENCY_MISSING: "/docs/cli/doctor",
|
|
208
213
|
BLUME_DUPLICATE_ROUTE: DOCS_CONTENT_NAVIGATION,
|
|
209
214
|
BLUME_DUPLICATE_SIDEBAR_ORDER: DOCS_CONTENT_NAVIGATION,
|
|
215
|
+
BLUME_EXAMPLE_NOT_FOUND: "/docs/content/components#component",
|
|
210
216
|
BLUME_FRONTMATTER_INVALID: "/docs/content/frontmatter",
|
|
211
217
|
BLUME_INCLUDE_CYCLE: DOCS_CONTENT_INCLUDES,
|
|
212
218
|
BLUME_INCLUDE_MALFORMED: DOCS_CONTENT_INCLUDES,
|
|
@@ -221,13 +227,17 @@ var DOCS_PATHS = new Map(Object.entries({
|
|
|
221
227
|
BLUME_NAV_INDEX_TITLE_MISMATCH: DOCS_CONTENT_NAVIGATION,
|
|
222
228
|
BLUME_NAV_MISSING_PAGE: DOCS_CONTENT_NAVIGATION,
|
|
223
229
|
BLUME_NODE_VERSION: "/docs/quickstart",
|
|
230
|
+
BLUME_SEARCH_SYNC_FAILED: "/docs/configuration/search",
|
|
224
231
|
BLUME_SERVER_FEATURE_REQUIRED: DOCS_DEPLOYMENT,
|
|
225
232
|
BLUME_SIDEBAR_DISPLAY_IGNORED: DOCS_CONTENT_NAVIGATION,
|
|
226
233
|
BLUME_SOURCE_FETCH_FAILED: DOCS_CONTENT_SOURCES,
|
|
227
234
|
BLUME_SOURCE_MISCONFIGURED: DOCS_CONTENT_SOURCES,
|
|
228
235
|
BLUME_SOURCE_OFFLINE: DOCS_CONTENT_SOURCES,
|
|
236
|
+
BLUME_SOURCE_PATH_MISSING: "/docs/content/sources/remote-mdx",
|
|
229
237
|
BLUME_SOURCE_SDK_MISSING: DOCS_CONTENT_SOURCES,
|
|
230
238
|
BLUME_SOURCE_UNAVAILABLE: DOCS_CONTENT_SOURCES,
|
|
239
|
+
BLUME_SOURCE_UNRESOLVED_LINK: "/docs/content/sources/contentful",
|
|
240
|
+
BLUME_SOURCE_UNSUPPORTED_NODE: "/docs/content/sources/payload",
|
|
231
241
|
BLUME_TRANSLATE_MISSING: "/docs/cli/translate",
|
|
232
242
|
BLUME_TRANSLATE_STALE: "/docs/cli/translate",
|
|
233
243
|
BLUME_UNKNOWN_COMPONENT: "/docs/configuration/customization",
|
|
@@ -235,8 +245,8 @@ var DOCS_PATHS = new Map(Object.entries({
|
|
|
235
245
|
BLUME_UNKNOWN_ICON: DOCS_CONTENT_NAVIGATION,
|
|
236
246
|
BLUME_UNKNOWN_OPTION: "/docs/cli",
|
|
237
247
|
BLUME_UNLOADABLE_FILE_NAME: "/docs/content",
|
|
238
|
-
BLUME_WIKILINK_AMBIGUOUS:
|
|
239
|
-
BLUME_WIKILINK_UNRESOLVED:
|
|
248
|
+
BLUME_WIKILINK_AMBIGUOUS: DOCS_CONTENT_SOURCES_OBSIDIAN,
|
|
249
|
+
BLUME_WIKILINK_UNRESOLVED: DOCS_CONTENT_SOURCES_OBSIDIAN,
|
|
240
250
|
BLUME_YARN_PNP: "/docs/quickstart"
|
|
241
251
|
}));
|
|
242
252
|
var resolveDocsUrl = (code) => {
|
|
@@ -680,23 +690,24 @@ var main = defineCommand({
|
|
|
680
690
|
version: getBlumeVersion()
|
|
681
691
|
},
|
|
682
692
|
subCommands: {
|
|
683
|
-
add: lazyCommand(commandMeta.add, () => import("./chunk-
|
|
684
|
-
audit: lazyCommand(commandMeta.audit, () => import("./chunk-
|
|
685
|
-
build: lazyCommand(commandMeta.build, () => import("./chunk-
|
|
686
|
-
check: lazyCommand(commandMeta.check, () => import("./chunk-
|
|
687
|
-
dev: lazyCommand(commandMeta.dev, () => import("./chunk-
|
|
688
|
-
doctor: lazyCommand(commandMeta.doctor, () => import("./chunk-
|
|
689
|
-
eject: lazyCommand(commandMeta.eject, () => import("./chunk-
|
|
690
|
-
eval: lazyCommand(commandMeta.eval, () => import("./chunk-
|
|
691
|
-
init: lazyCommand(commandMeta.init, () => import("./chunk-
|
|
692
|
-
"mcp-stdio": lazyCommand(commandMeta["mcp-stdio"], () => import("./chunk-
|
|
693
|
-
migrate: lazyCommand(commandMeta.migrate, () => import("./chunk-
|
|
694
|
-
preview: lazyCommand(commandMeta.preview, () => import("./chunk-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
693
|
+
add: lazyCommand(commandMeta.add, () => import("./chunk-kma9f6sf.js"), "addCommand"),
|
|
694
|
+
audit: lazyCommand(commandMeta.audit, () => import("./chunk-e6atmn4h.js"), "auditCommand"),
|
|
695
|
+
build: lazyCommand(commandMeta.build, () => import("./chunk-073rdvgb.js"), "buildCommand"),
|
|
696
|
+
check: lazyCommand(commandMeta.check, () => import("./chunk-nq1d20w2.js"), "checkCommand"),
|
|
697
|
+
dev: lazyCommand(commandMeta.dev, () => import("./chunk-7ppf1rva.js"), "devCommand"),
|
|
698
|
+
doctor: lazyCommand(commandMeta.doctor, () => import("./chunk-3x6x3pph.js"), "doctorCommand"),
|
|
699
|
+
eject: lazyCommand(commandMeta.eject, () => import("./chunk-hx3xqnk9.js"), "ejectCommand"),
|
|
700
|
+
eval: lazyCommand(commandMeta.eval, () => import("./chunk-htrwgabr.js"), "evalCommand"),
|
|
701
|
+
init: lazyCommand(commandMeta.init, () => import("./chunk-fdrkhpjy.js"), "initCommand"),
|
|
702
|
+
"mcp-stdio": lazyCommand(commandMeta["mcp-stdio"], () => import("./chunk-hebn0tpx.js"), "mcpStdioCommand"),
|
|
703
|
+
migrate: lazyCommand(commandMeta.migrate, () => import("./chunk-c887fj0s.js"), "migrateCommand"),
|
|
704
|
+
preview: lazyCommand(commandMeta.preview, () => import("./chunk-tdqhyxfz.js"), "previewCommand"),
|
|
705
|
+
skill: lazyCommand(commandMeta.skill, () => import("./chunk-tphac74f.js"), "skillCommand"),
|
|
706
|
+
sync: lazyCommand(commandMeta.sync, () => import("./chunk-e9q7a2ak.js"), "syncCommand"),
|
|
707
|
+
translate: lazyCommand(commandMeta.translate, () => import("./chunk-5vjtgs6e.js"), "translateCommand"),
|
|
708
|
+
upgrade: lazyCommand(commandMeta.upgrade, () => import("./chunk-8y2kmjv8.js"), "upgradeCommand"),
|
|
709
|
+
validate: lazyCommand(commandMeta.validate, () => import("./chunk-cfyg47zg.js"), "validateCommand"),
|
|
710
|
+
version: lazyCommand(commandMeta.version, () => import("./chunk-ft9vfys6.js"), "versionCommand")
|
|
700
711
|
}
|
|
701
712
|
});
|
|
702
713
|
loadEnvFiles(process.cwd());
|
|
@@ -731,5 +742,5 @@ export {
|
|
|
731
742
|
closestMatch
|
|
732
743
|
};
|
|
733
744
|
|
|
734
|
-
//# debugId=
|
|
745
|
+
//# debugId=D285C7A054BEC2C764756E2164756E21
|
|
735
746
|
//# sourceMappingURL=index.js.map
|
package/dist/cli/index.js.map
CHANGED
|
@@ -2,19 +2,19 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/cli/index.ts", "../src/core/version.ts", "../src/core/package-root.ts", "../src/cli/command-meta.ts", "../src/cli/env.ts", "../src/cli/host-args.ts", "../src/cli/internal-error.ts", "../src/core/diagnostics.ts", "../src/cli/log.ts", "../src/cli/unknown-flags.ts", "../src/cli/lazy-command.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import { defineCommand, runMain } from \"citty\";\n\nimport { getBlumeVersion } from \"../core/version.ts\";\nimport { commandMeta } from \"./command-meta.ts\";\nimport { loadEnvFiles } from \"./env.ts\";\nimport { normalizeHostArgs } from \"./host-args.ts\";\nimport { reportInternalError } from \"./internal-error.ts\";\nimport { lazyCommand } from \"./lazy-command.ts\";\n// consola reads CONSOLA_LEVEL / NODE_ENV / TEST / CI / DEBUG when its module\n// evaluates. Import the logger here, ahead of `loadEnvFiles`, so those values\n// come from the real environment — never from a project `.env`, which would\n// otherwise silence or restyle every command's output. The commands are loaded\n// lazily below, so without this line consola would first evaluate after `.env`\n// had been applied.\nimport \"./log.ts\";\n\nconst main = defineCommand({\n meta: {\n description: \"The open-source docs framework for humans and agents.\",\n name: \"blume\",\n version: getBlumeVersion(),\n },\n subCommands: {\n add: lazyCommand(\n commandMeta.add,\n () => import(\"./commands/add.ts\"),\n \"addCommand\"\n ),\n audit: lazyCommand(\n commandMeta.audit,\n () => import(\"./commands/audit.ts\"),\n \"auditCommand\"\n ),\n build: lazyCommand(\n commandMeta.build,\n () => import(\"./commands/build.ts\"),\n \"buildCommand\"\n ),\n check: lazyCommand(\n commandMeta.check,\n () => import(\"./commands/check.ts\"),\n \"checkCommand\"\n ),\n dev: lazyCommand(\n commandMeta.dev,\n () => import(\"./commands/dev.ts\"),\n \"devCommand\"\n ),\n doctor: lazyCommand(\n commandMeta.doctor,\n () => import(\"./commands/doctor.ts\"),\n \"doctorCommand\"\n ),\n eject: lazyCommand(\n commandMeta.eject,\n () => import(\"./commands/eject.ts\"),\n \"ejectCommand\"\n ),\n eval: lazyCommand(\n commandMeta.eval,\n () => import(\"./commands/eval.ts\"),\n \"evalCommand\"\n ),\n init: lazyCommand(\n commandMeta.init,\n () => import(\"./commands/init.ts\"),\n \"initCommand\"\n ),\n \"mcp-stdio\": lazyCommand(\n commandMeta[\"mcp-stdio\"],\n () => import(\"./commands/mcp-stdio.ts\"),\n \"mcpStdioCommand\"\n ),\n migrate: lazyCommand(\n commandMeta.migrate,\n () => import(\"./commands/migrate.ts\"),\n \"migrateCommand\"\n ),\n preview: lazyCommand(\n commandMeta.preview,\n () => import(\"./commands/preview.ts\"),\n \"previewCommand\"\n ),\n sync: lazyCommand(\n commandMeta.sync,\n () => import(\"./commands/sync.ts\"),\n \"syncCommand\"\n ),\n translate: lazyCommand(\n commandMeta.translate,\n () => import(\"./commands/translate.ts\"),\n \"translateCommand\"\n ),\n upgrade: lazyCommand(\n commandMeta.upgrade,\n () => import(\"./commands/upgrade.ts\"),\n \"upgradeCommand\"\n ),\n validate: lazyCommand(\n commandMeta.validate,\n () => import(\"./commands/validate.ts\"),\n \"validateCommand\"\n ),\n version: lazyCommand(\n commandMeta.version,\n () => import(\"./commands/version.ts\"),\n \"versionCommand\"\n ),\n },\n});\n\nloadEnvFiles(process.cwd());\n\nprocess.on(\"uncaughtException\", (error) => {\n reportInternalError(error);\n process.exit(1);\n});\nprocess.on(\"unhandledRejection\", (error) => {\n reportInternalError(error);\n process.exit(1);\n});\n\nrunMain(main, { rawArgs: normalizeHostArgs(process.argv.slice(2)) });\n",
|
|
5
|
+
"import { defineCommand, runMain } from \"citty\";\n\nimport { getBlumeVersion } from \"../core/version.ts\";\nimport { commandMeta } from \"./command-meta.ts\";\nimport { loadEnvFiles } from \"./env.ts\";\nimport { normalizeHostArgs } from \"./host-args.ts\";\nimport { reportInternalError } from \"./internal-error.ts\";\nimport { lazyCommand } from \"./lazy-command.ts\";\n// consola reads CONSOLA_LEVEL / NODE_ENV / TEST / CI / DEBUG when its module\n// evaluates. Import the logger here, ahead of `loadEnvFiles`, so those values\n// come from the real environment — never from a project `.env`, which would\n// otherwise silence or restyle every command's output. The commands are loaded\n// lazily below, so without this line consola would first evaluate after `.env`\n// had been applied.\nimport \"./log.ts\";\n\nconst main = defineCommand({\n meta: {\n description: \"The open-source docs framework for humans and agents.\",\n name: \"blume\",\n version: getBlumeVersion(),\n },\n subCommands: {\n add: lazyCommand(\n commandMeta.add,\n () => import(\"./commands/add.ts\"),\n \"addCommand\"\n ),\n audit: lazyCommand(\n commandMeta.audit,\n () => import(\"./commands/audit.ts\"),\n \"auditCommand\"\n ),\n build: lazyCommand(\n commandMeta.build,\n () => import(\"./commands/build.ts\"),\n \"buildCommand\"\n ),\n check: lazyCommand(\n commandMeta.check,\n () => import(\"./commands/check.ts\"),\n \"checkCommand\"\n ),\n dev: lazyCommand(\n commandMeta.dev,\n () => import(\"./commands/dev.ts\"),\n \"devCommand\"\n ),\n doctor: lazyCommand(\n commandMeta.doctor,\n () => import(\"./commands/doctor.ts\"),\n \"doctorCommand\"\n ),\n eject: lazyCommand(\n commandMeta.eject,\n () => import(\"./commands/eject.ts\"),\n \"ejectCommand\"\n ),\n eval: lazyCommand(\n commandMeta.eval,\n () => import(\"./commands/eval.ts\"),\n \"evalCommand\"\n ),\n init: lazyCommand(\n commandMeta.init,\n () => import(\"./commands/init.ts\"),\n \"initCommand\"\n ),\n \"mcp-stdio\": lazyCommand(\n commandMeta[\"mcp-stdio\"],\n () => import(\"./commands/mcp-stdio.ts\"),\n \"mcpStdioCommand\"\n ),\n migrate: lazyCommand(\n commandMeta.migrate,\n () => import(\"./commands/migrate.ts\"),\n \"migrateCommand\"\n ),\n preview: lazyCommand(\n commandMeta.preview,\n () => import(\"./commands/preview.ts\"),\n \"previewCommand\"\n ),\n skill: lazyCommand(\n commandMeta.skill,\n () => import(\"./commands/skill.ts\"),\n \"skillCommand\"\n ),\n sync: lazyCommand(\n commandMeta.sync,\n () => import(\"./commands/sync.ts\"),\n \"syncCommand\"\n ),\n translate: lazyCommand(\n commandMeta.translate,\n () => import(\"./commands/translate.ts\"),\n \"translateCommand\"\n ),\n upgrade: lazyCommand(\n commandMeta.upgrade,\n () => import(\"./commands/upgrade.ts\"),\n \"upgradeCommand\"\n ),\n validate: lazyCommand(\n commandMeta.validate,\n () => import(\"./commands/validate.ts\"),\n \"validateCommand\"\n ),\n version: lazyCommand(\n commandMeta.version,\n () => import(\"./commands/version.ts\"),\n \"versionCommand\"\n ),\n },\n});\n\nloadEnvFiles(process.cwd());\n\nprocess.on(\"uncaughtException\", (error) => {\n reportInternalError(error);\n process.exit(1);\n});\nprocess.on(\"unhandledRejection\", (error) => {\n reportInternalError(error);\n process.exit(1);\n});\n\nrunMain(main, { rawArgs: normalizeHostArgs(process.argv.slice(2)) });\n",
|
|
6
6
|
"import { readFileSync } from \"node:fs\";\n\nimport { join } from \"pathe\";\n\nimport { packageRoot } from \"./package-root.ts\";\n\nlet cached: string | undefined;\n\n/**\n * The installed Blume package version, read lazily from its `package.json`.\n *\n * Computed on demand (not at module load) so importing the `blume` barrel has no\n * filesystem side effect, and anchored at the package root so it resolves the\n * same whether running from source or the bundled CLI.\n */\nexport const getBlumeVersion = (): string => {\n if (cached === undefined) {\n const pkgPath = join(packageRoot(), \"package.json\");\n // SAFETY: this reads blume's own package.json, which always declares a\n // `version` (publishing requires it).\n cached = (JSON.parse(readFileSync(pkgPath, \"utf-8\")) as { version: string })\n .version;\n }\n return cached;\n};\n",
|
|
7
7
|
"import { existsSync } from \"node:fs\";\n\nimport { dirname, join } from \"pathe\";\n\n/**\n * Walk up from `start` until a directory containing a `package.json` is found.\n *\n * Exported for testing; call sites should use {@link packageRoot}.\n */\nexport const findPackageRoot = (start: string): string => {\n let dir = start;\n while (!existsSync(join(dir, \"package.json\"))) {\n const parent = dirname(dir);\n if (parent === dir) {\n throw new Error(\"blume: unable to locate the package root\");\n }\n dir = parent;\n }\n return dir;\n};\n\nlet cached: string | undefined;\n\n/**\n * Absolute path to the installed Blume package root (the directory holding its\n * `package.json`), found by walking up from this module.\n *\n * Anchoring here — rather than at a fixed offset from `import.meta` — keeps the\n * package's own `src/`, assets, and `node_modules` locatable whether the code\n * runs from source under Bun (`src/...`) or from the published, bundled CLI\n * (`dist/cli/*.js`). The two layouts sit at different depths, so a relative\n * `../..` resolves to different places; locating `package.json` does not.\n */\nexport const packageRoot = (): string => {\n cached ??= findPackageRoot(import.meta.dirname);\n return cached;\n};\n",
|
|
8
|
-
"import type { CommandMeta } from \"citty\";\n\n/**\n * Every command's `meta`, held apart from the command modules themselves.\n *\n * The CLI entry loads each command lazily (see `lazy-command.ts`), but citty\n * still reads every subcommand's `meta` to render `blume --help` and to match\n * an unknown name against aliases. Keeping that table here lets those paths\n * run without importing a single command module — `dev` alone drags in Astro,\n * `mcp-stdio` the MCP SDK. The command modules read their `meta` from this\n * table too, so the entry and the command can't drift.\n */\nexport const commandMeta = {\n add: {\n description: \"Install a source component or template from the registry.\",\n name: \"add\",\n },\n audit: {\n description: \"Audit the built site for SEO and site-health issues.\",\n name: \"audit\",\n },\n build: {\n description: \"Build the docs site for production.\",\n name: \"build\",\n },\n check: {\n description: \"Type-check the docs site with astro check.\",\n name: \"check\",\n },\n dev: {\n description: \"Start the Blume development server.\",\n name: \"dev\",\n },\n doctor: {\n description: \"Diagnose common configuration and content problems.\",\n name: \"doctor\",\n },\n eject: {\n description: \"Promote the generated runtime into an owned Astro project.\",\n name: \"eject\",\n },\n eval: {\n description:\n \"Test the docs: an agent answers your questions using only the documentation.\",\n name: \"eval\",\n },\n init: {\n description: \"Scaffold a minimal Blume project.\",\n name: \"init\",\n },\n \"mcp-stdio\": {\n description:\n \"Serve an MCP data snapshot over stdio (internal, used by `blume eval`).\",\n name: \"mcp-stdio\",\n },\n migrate: {\n description:\n \"Migrate a docs site from Mintlify, Fumadocs, Docusaurus, Starlight, or Nextra with a coding agent.\",\n name: \"migrate\",\n },\n preview: {\n description: \"Preview the last production build.\",\n name: \"preview\",\n },\n sync: {\n description: \"Re-fetch remote content sources and regenerate the runtime.\",\n name: \"sync\",\n },\n translate: {\n description:\n \"Translate docs into the configured locales with a local agent CLI.\",\n name: \"translate\",\n },\n upgrade: {\n description:\n \"Upgrade to this version of Blume: bump the dependency and list the config changes left.\",\n name: \"upgrade\",\n },\n validate: {\n description: \"Validate internal, anchor, asset, and external links.\",\n name: \"validate\",\n },\n version: {\n description: \"Freeze the current docs as an archived version.\",\n name: \"version\",\n },\n} satisfies Record<string, CommandMeta>;\n",
|
|
8
|
+
"import type { CommandMeta } from \"citty\";\n\n/**\n * Every command's `meta`, held apart from the command modules themselves.\n *\n * The CLI entry loads each command lazily (see `lazy-command.ts`), but citty\n * still reads every subcommand's `meta` to render `blume --help` and to match\n * an unknown name against aliases. Keeping that table here lets those paths\n * run without importing a single command module — `dev` alone drags in Astro,\n * `mcp-stdio` the MCP SDK. The command modules read their `meta` from this\n * table too, so the entry and the command can't drift.\n */\nexport const commandMeta = {\n add: {\n description: \"Install a source component or template from the registry.\",\n name: \"add\",\n },\n audit: {\n description: \"Audit the built site for SEO and site-health issues.\",\n name: \"audit\",\n },\n build: {\n description: \"Build the docs site for production.\",\n name: \"build\",\n },\n check: {\n description: \"Type-check the docs site with astro check.\",\n name: \"check\",\n },\n dev: {\n description: \"Start the Blume development server.\",\n name: \"dev\",\n },\n doctor: {\n description: \"Diagnose common configuration and content problems.\",\n name: \"doctor\",\n },\n eject: {\n description: \"Promote the generated runtime into an owned Astro project.\",\n name: \"eject\",\n },\n eval: {\n description:\n \"Test the docs: an agent answers your questions using only the documentation.\",\n name: \"eval\",\n },\n init: {\n description: \"Scaffold a minimal Blume project.\",\n name: \"init\",\n },\n \"mcp-stdio\": {\n description:\n \"Serve an MCP data snapshot over stdio (internal, used by `blume eval`).\",\n name: \"mcp-stdio\",\n },\n migrate: {\n description:\n \"Migrate a docs site from Mintlify, Fumadocs, Docusaurus, Starlight, or Nextra with a coding agent.\",\n name: \"migrate\",\n },\n preview: {\n description: \"Preview the last production build.\",\n name: \"preview\",\n },\n skill: {\n description:\n \"Write the docs site's agent skill with a coding agent, in place of the generated one.\",\n name: \"skill\",\n },\n sync: {\n description: \"Re-fetch remote content sources and regenerate the runtime.\",\n name: \"sync\",\n },\n translate: {\n description:\n \"Translate docs into the configured locales with a local agent CLI.\",\n name: \"translate\",\n },\n upgrade: {\n description:\n \"Upgrade to this version of Blume: bump the dependency and list the config changes left.\",\n name: \"upgrade\",\n },\n validate: {\n description: \"Validate internal, anchor, asset, and external links.\",\n name: \"validate\",\n },\n version: {\n description: \"Freeze the current docs as an archived version.\",\n name: \"version\",\n },\n} satisfies Record<string, CommandMeta>;\n",
|
|
9
9
|
"import { existsSync } from \"node:fs\";\n\nimport { config } from \"dotenv\";\nimport { dirname, join, resolve } from \"pathe\";\n\n// Blume's remote sources (GitHub Releases, mdx-remote, Sanity, Notion…) read\n// their tokens from `process.env` during the content scan — which runs before\n// Astro/Vite boots, so Vite's own `.env` loading is too late. This loader fills\n// that gap: it cascades `.env`/`.env.local` from the working dir up to the repo\n// root, so a monorepo can keep one `.env` at the root and every app picks it up.\n\n/**\n * Load `.env`/`.env.local`, cascading from `startDir` up to the repository root\n * (the first ancestor containing a `.git`) or the filesystem root. The ordered\n * path list is handed to dotenv, whose `config` is first-wins, never clobbers\n * existing `process.env` values, and treats unreadable files as best-effort —\n * so shell/CI overrides are never lost, `.env.local` layers over `.env`, and a\n * bad file never aborts a build. dotenv is also the parser Vite runs over\n * these files at build time, so a value means the same thing to the pre-boot\n * content scan and the built site — including multi-line double-quoted values\n * (PEM keys), which a line-based parser silently truncates.\n *\n * `NODE_ENV` is never taken from these files: it picks the mode Vite and Astro\n * run in, so a monorepo root `.env` that sets it for another app would turn\n * every `blume build` into a development build (or `blume dev` into a\n * production one).\n */\nexport const loadEnvFiles = (startDir: string): void => {\n const paths: string[] = [];\n let dir = resolve(startDir);\n let done = false;\n while (!done) {\n paths.push(join(dir, \".env.local\"), join(dir, \".env\"));\n const parent = dirname(dir);\n // Stop at the repo root (nearest `.git`) or the filesystem root.\n done = existsSync(join(dir, \".git\")) || parent === dir;\n dir = parent;\n }\n const loaded: Record<string, string> = {};\n config({ path: paths, processEnv: loaded, quiet: true });\n for (const [key, value] of Object.entries(loaded)) {\n if (key !== \"NODE_ENV\" && process.env[key] === undefined) {\n process.env[key] = value;\n }\n }\n};\n",
|
|
10
10
|
"/**\n * Rewrite a bare `--host` in the raw argv to `--host=` before citty parses it.\n *\n * `host` is a string arg (citty has no mixed string/boolean type), and citty\n * 0.2 parses with `node:util.parseArgs`, where a string option consumes the\n * next token as its value even when that token is another flag: `blume dev\n * --host --open` would bind the literal hostname \"--open\" and drop `--open`.\n * The `--host=` spelling parses as `\"\"` without touching its neighbor, which\n * `normalizeHost` then maps to Astro's \"bind all interfaces\".\n */\nexport const normalizeHostArgs = (rawArgs: readonly string[]): string[] =>\n rawArgs.map((arg, index) => {\n if (arg !== \"--host\") {\n return arg;\n }\n const next = rawArgs[index + 1];\n return next === undefined || next.startsWith(\"-\") ? \"--host=\" : arg;\n });\n\n/**\n * Resolve a `--host` flag value into what Astro/Vite's `server.host` expects.\n * citty has no mixed string/boolean arg type, so `host` is declared as a\n * string and a bare `--host` parses as `\"\"` (`normalizeHostArgs` rewrites it\n * to `--host=` first) — Node would bind all interfaces for `\"\"`, but Vite's\n * `resolveHostname` treats it as a literal hostname and prints malformed URLs\n * like `http://:4321/`. Match Astro's own `--host` semantics instead: bare\n * flag → `true` (bind all interfaces), `--host 10.0.0.1` → that address,\n * absent → `false` (localhost only).\n *\n * Lives beside `normalizeHostArgs` rather than in `commands/dev.ts` so\n * `preview` can share it without importing the whole dev command graph.\n */\nexport const normalizeHost = (host?: string): boolean | string =>\n host === \"\" ? true : (host ?? false);\n",
|
|
11
11
|
"import { colors } from \"consola/utils\";\n\nimport { getBlumeVersion } from \"../core/version.ts\";\n\nconst ISSUES_URL = \"https://github.com/haydenbleasel/blume/issues\";\n\n// Absolute paths into the hidden generated runtime — POSIX (`…/.blume/…`) or\n// Windows drive-letter (`C:\\…\\.blume\\…`) — including any trailing `:line:col`,\n// stopping at whitespace or a closing paren.\nconst BLUME_FRAME =\n /(?<abs>(?:\\/[^\\s()]*\\/|[A-Za-z]:\\\\[^\\s()]*\\\\)\\.blume[/\\\\][^\\s()]*)/gu;\n\n// The separator immediately before `.blume/` (or `.blume\\`) in a matched path.\nconst BLUME_MARKER = /[/\\\\]\\.blume[/\\\\]/u;\n\n/**\n * Rewrite `.blume/` frames in a stack so the generated runtime reads clearly:\n * the machine-absolute prefix is dropped to a project-relative `.blume/…` path\n * and tagged `(generated)`, keeping the reader oriented instead of staring at a\n * long path into a hidden directory. Frames in the user's own source (custom\n * pages keep their real location; wrappers import user files by their real path)\n * are untouched, so the actionable frame stays intact.\n */\nexport const remapBlumeStack = (stack: string): string =>\n stack.replaceAll(BLUME_FRAME, (match) => {\n const marker = match.search(BLUME_MARKER);\n return `${match.slice(marker + 1)} (generated)`;\n });\n\n/**\n * Print an unexpected (non-{@link BlumeError}) failure in a stable, reportable\n * shape instead of a bare stack trace: a fixed `BLUME_INTERNAL` code, the\n * message, a trimmed stack, and an environment dump for bug reports. Callers\n * exit after this — it doesn't exit itself, so it's testable.\n */\n// oxlint-disable-next-line anti-slop/no-unknown-parameters -- last-resort handler for whatever a catch clause caught; anything narrower would force casts at every call site\nexport const reportInternalError = (error: unknown): void => {\n const err = error instanceof Error ? error : new Error(String(error));\n const lines = [\n `${colors.red(colors.bold(\"BLUME_INTERNAL\"))} An unexpected error occurred.`,\n ` ${err.message}`,\n ];\n\n // A few frames are enough to locate the fault without burying the report;\n // `.blume/` frames are relativized so the hidden runtime reads clearly.\n const stack = remapBlumeStack(err.stack ?? \"\")\n .split(\"\\n\")\n .slice(1, 5)\n .map((line) => line.trim())\n .filter(Boolean);\n if (stack.length > 0) {\n lines.push(\"\", colors.dim(stack.join(\"\\n\")));\n }\n\n lines.push(\n \"\",\n \"This is likely a bug in Blume. Please report it with the details below:\",\n colors.dim(\n [\n ` Blume: ${getBlumeVersion()}`,\n ` Node: ${process.version}`,\n ` Platform: ${process.platform} ${process.arch}`,\n ].join(\"\\n\")\n ),\n ` ${ISSUES_URL}`\n );\n\n process.stderr.write(`${lines.join(\"\\n\")}\\n`);\n};\n",
|
|
12
|
-
"import { colors } from \"consola/utils\";\nimport { relative } from \"pathe\";\nimport type { ZodError } from \"zod\";\n\nimport type { Diagnostic } from \"./types.ts\";\n\n/** A recoverable error carrying a structured diagnostic. */\nexport class BlumeError extends Error {\n readonly diagnostic: Diagnostic;\n\n constructor(diagnostic: Diagnostic) {\n super(diagnostic.message);\n this.name = \"BlumeError\";\n this.diagnostic = diagnostic;\n }\n}\n\nexport const createDiagnostic = (diagnostic: Diagnostic): Diagnostic =>\n diagnostic;\n\n/** Docs site base; diagnostic help links resolve against it. */\nconst DOCS_BASE = \"https://useblume.dev\";\n\nconst DOCS_DEPLOYMENT = \"/docs/deployment\";\nconst DOCS_CLI_VALIDATE = \"/docs/cli/validate\";\nconst DOCS_CONTENT_SOURCES = \"/docs/content/sources\";\nconst DOCS_CONTENT_NAVIGATION = \"/docs/content/navigation\";\nconst DOCS_CONTENT_INCLUDES = \"/docs/content/includes\";\n\n/** Diagnostic code → the docs page that explains it. */\nconst DOCS_PATHS = new Map(\n Object.entries({\n BLUME_ADAPTER_REQUIRED: DOCS_DEPLOYMENT,\n BLUME_ASSETS_UNCHECKED: DOCS_CLI_VALIDATE,\n BLUME_ASSET_FETCH_FAILED: DOCS_CONTENT_SOURCES,\n BLUME_BROKEN_ANCHOR: DOCS_CLI_VALIDATE,\n BLUME_BROKEN_ASSET: DOCS_CLI_VALIDATE,\n BLUME_BROKEN_LINK: DOCS_CLI_VALIDATE,\n BLUME_COMPONENTS_INVALID: \"/docs/configuration/customization\",\n BLUME_CONFIG_INVALID: \"/docs/configuration\",\n BLUME_CONFIG_LOAD_FAILED: \"/docs/configuration\",\n BLUME_CONTENT_ROOT_MISSING: DOCS_CONTENT_SOURCES,\n BLUME_DEAD_LINK: DOCS_CLI_VALIDATE,\n BLUME_DEPENDENCY_MISSING: \"/docs/cli/doctor\",\n BLUME_DUPLICATE_ROUTE: DOCS_CONTENT_NAVIGATION,\n BLUME_DUPLICATE_SIDEBAR_ORDER: DOCS_CONTENT_NAVIGATION,\n BLUME_FRONTMATTER_INVALID: \"/docs/content/frontmatter\",\n BLUME_INCLUDE_CYCLE: DOCS_CONTENT_INCLUDES,\n BLUME_INCLUDE_MALFORMED: DOCS_CONTENT_INCLUDES,\n BLUME_INCLUDE_NOT_FOUND: DOCS_CONTENT_INCLUDES,\n BLUME_INCLUDE_OUTSIDE_ROOT: DOCS_CONTENT_INCLUDES,\n BLUME_MDX_CURLY_ANCHOR: \"/docs/content/syntax\",\n\n BLUME_META_INVALID: \"/docs/content/meta\",\n BLUME_META_LOAD_FAILED: \"/docs/content/meta\",\n BLUME_MISSING_SECRET: DOCS_DEPLOYMENT,\n BLUME_NAV_DUPLICATE_LABEL: DOCS_CONTENT_NAVIGATION,\n BLUME_NAV_HIDDEN_IN_SIDEBAR: DOCS_CONTENT_NAVIGATION,\n BLUME_NAV_INDEX_TITLE_MISMATCH: DOCS_CONTENT_NAVIGATION,\n BLUME_NAV_MISSING_PAGE: DOCS_CONTENT_NAVIGATION,\n BLUME_NODE_VERSION: \"/docs/quickstart\",\n BLUME_SERVER_FEATURE_REQUIRED: DOCS_DEPLOYMENT,\n BLUME_SIDEBAR_DISPLAY_IGNORED: DOCS_CONTENT_NAVIGATION,\n BLUME_SOURCE_FETCH_FAILED: DOCS_CONTENT_SOURCES,\n BLUME_SOURCE_MISCONFIGURED: DOCS_CONTENT_SOURCES,\n BLUME_SOURCE_OFFLINE: DOCS_CONTENT_SOURCES,\n BLUME_SOURCE_SDK_MISSING: DOCS_CONTENT_SOURCES,\n BLUME_SOURCE_UNAVAILABLE: DOCS_CONTENT_SOURCES,\n BLUME_TRANSLATE_MISSING: \"/docs/cli/translate\",\n BLUME_TRANSLATE_STALE: \"/docs/cli/translate\",\n BLUME_UNKNOWN_COMPONENT: \"/docs/configuration/customization\",\n BLUME_UNKNOWN_DIRECTIVE: \"/docs/content/syntax\",\n BLUME_UNKNOWN_ICON: DOCS_CONTENT_NAVIGATION,\n BLUME_UNKNOWN_OPTION: \"/docs/cli\",\n BLUME_UNLOADABLE_FILE_NAME: \"/docs/content\",\n BLUME_WIKILINK_AMBIGUOUS: DOCS_CONTENT_SOURCES,\n BLUME_WIKILINK_UNRESOLVED: DOCS_CONTENT_SOURCES,\n BLUME_YARN_PNP: \"/docs/quickstart\",\n })\n);\n\n/** The docs URL that explains a diagnostic code, if one is mapped. */\nexport const resolveDocsUrl = (code: string): string | undefined => {\n const path = DOCS_PATHS.get(code);\n return path ? `${DOCS_BASE}${path}` : undefined;\n};\n\n/** Fill in `docsUrl` from the code map where a diagnostic doesn't set its own. */\nexport const enrichDiagnostic = (diagnostic: Diagnostic): Diagnostic =>\n diagnostic.docsUrl\n ? diagnostic\n : { ...diagnostic, docsUrl: resolveDocsUrl(diagnostic.code) };\n\nconst REGEXP_SPECIAL = /[$()*+.?[\\\\\\]^{|}]/gu;\nconst escapeRegExp = (value: string): string =>\n value.replaceAll(REGEXP_SPECIAL, String.raw`\\$&`);\n\n/** A key segment scans the source text; an array index has no key to find. */\nconst isKeySegment = (segment: string | number): segment is string =>\n typeof segment === \"string\";\n\n/**\n * Where a located value's children are searched. `object` and `array` are the\n * inside of a `{…}`/`[…]` literal, searched entry by entry so a key or an index\n * only matches a direct child. `block` has no brackets — the whole file at the\n * top, or a YAML key's indented lines — and is searched at any depth.\n */\ninterface Scope {\n end: number;\n /** A literal's direct entries (keys or elements), in source order. */\n entries: number[];\n kind: \"array\" | \"block\" | \"object\";\n start: number;\n}\n\n/** A located key or element: where it starts, and where its value starts. */\ninterface Step {\n index: number;\n next: number;\n}\n\nconst QUOTES = new Set(['\"', \"'\", \"`\"]);\nconst OPENERS = new Set([\"(\", \"[\", \"{\"]);\nconst CLOSERS = new Set([\")\", \"]\", \"}\"]);\nconst WHITESPACE = /\\s/u;\n\n/**\n * The index just past a comment starting at `index`, or `index` when none does.\n * A `//` after a `:` is a URL scheme in YAML (`href: https://…`), not a comment.\n */\nconst skipComment = (source: string, index: number): number => {\n if (source.startsWith(\"//\", index) && source.charAt(index - 1) !== \":\") {\n const end = source.indexOf(\"\\n\", index);\n return end === -1 ? source.length : end;\n }\n if (source.startsWith(\"/*\", index)) {\n const end = source.indexOf(\"*/\", index + 2);\n return end === -1 ? source.length : end + 2;\n }\n return index;\n};\n\n/**\n * The index just past a string literal starting at `index`, or `index` when\n * none does. A `'`/`\"` that doesn't close on its own line is an apostrophe in\n * plain YAML text, not a string.\n */\nconst skipString = (source: string, index: number): number => {\n const quote = source.charAt(index);\n if (!QUOTES.has(quote)) {\n return index;\n }\n let cursor = index + 1;\n while (cursor < source.length) {\n const char = source.charAt(cursor);\n if (char === quote) {\n return cursor + 1;\n }\n if (char === \"\\n\" && quote !== \"`\") {\n return index;\n }\n cursor += char === \"\\\\\" ? 2 : 1;\n }\n return index;\n};\n\n/** Where a literal closes, and where each of its direct entries starts. */\ninterface LiteralScan {\n end: number;\n entries: number[];\n}\n\n/**\n * Walk the `{…}`/`[…]` literal opened at `open`: where each direct entry starts\n * (a key, or an array element) and where the literal closes. Nested brackets,\n * strings, and comments are stepped over, so only the literal's own commas\n * separate its entries.\n */\nconst scanLiteral = (source: string, open: number): LiteralScan => {\n const entries: number[] = [];\n let depth = 0;\n let pending = true;\n let index = open + 1;\n while (index < source.length) {\n const afterComment = skipComment(source, index);\n const char = source.charAt(index);\n if (afterComment !== index || WHITESPACE.test(char)) {\n index = Math.max(afterComment, index + 1);\n continue;\n }\n if (depth === 0 && CLOSERS.has(char)) {\n return { end: index, entries };\n }\n if (depth === 0 && pending) {\n entries.push(index);\n pending = false;\n }\n const afterString = skipString(source, index);\n if (afterString !== index) {\n index = afterString;\n continue;\n }\n if (OPENERS.has(char)) {\n depth += 1;\n } else if (CLOSERS.has(char)) {\n depth -= 1;\n } else if (char === \",\" && depth === 0) {\n pending = true;\n }\n index += 1;\n }\n return { end: source.length, entries };\n};\n\n/**\n * The lines indented deeper than the key at `anchor` — a YAML mapping's\n * children — up to the first line that isn't, or `limit`.\n */\nconst indentedBlock = (\n source: string,\n anchor: number,\n limit: number\n): Scope => {\n const column = anchor - (source.lastIndexOf(\"\\n\", anchor - 1) + 1);\n const lineEnd = source.indexOf(\"\\n\", anchor);\n const start = lineEnd === -1 ? limit : Math.min(lineEnd + 1, limit);\n let end = start;\n while (end < limit) {\n const next = source.indexOf(\"\\n\", end);\n const after = next === -1 || next >= limit ? limit : next + 1;\n const line = source.slice(end, after);\n if (line.trim() !== \"\" && line.length - line.trimStart().length <= column) {\n break;\n }\n end = after;\n }\n return { end, entries: [], kind: \"block\", start };\n};\n\n/** A value's lead-in before its literal: spaces, or an adapter call's `vercel(`. */\nconst VALUE_LEAD = /[\\s\\w$.(]*/uy;\n\n/**\n * The scope holding the children of the key or element at `anchor`, whose\n * value starts at `from`. A `{…}`/`[…]` literal — written directly, or as the\n * first argument of a call like `vercel({…})` — is walked entry by entry;\n * anything else falls back to the lines indented under `anchor` (YAML's\n * nesting), within the enclosing scope's `limit`.\n */\nconst valueScope = (source: string, step: Step, limit: number): Scope => {\n VALUE_LEAD.lastIndex = step.next;\n VALUE_LEAD.exec(source);\n const open = VALUE_LEAD.lastIndex;\n const char = source.charAt(open);\n if (open < limit && (char === \"{\" || char === \"[\")) {\n const literal = scanLiteral(source, open);\n return {\n end: literal.end,\n entries: literal.entries,\n kind: char === \"{\" ? \"object\" : \"array\",\n start: open,\n };\n }\n return indentedBlock(source, step.index, limit);\n};\n\n/**\n * Find `segment` as a `key:`/`key =` (bare or quoted) in `scope`: among an\n * object literal's own entries, or anywhere in a block. The negative lookbehind\n * keeps `title` from matching the tail of an unrelated key such as `subtitle:`.\n */\nconst findKey = (\n source: string,\n scope: Scope,\n segment: string\n): Step | undefined => {\n const key = escapeRegExp(segment);\n const pattern = `(?<![\\\\w$])(?:${key}|\"${key}\"|'${key}')\\\\s*[:=]`;\n if (scope.kind === \"block\") {\n const matcher = new RegExp(pattern, \"gu\");\n matcher.lastIndex = scope.start;\n const match = matcher.exec(source);\n return match && match.index < scope.end\n ? { index: match.index, next: matcher.lastIndex }\n : undefined;\n }\n // Sticky: the key must start exactly where the entry does.\n const matcher = new RegExp(pattern, \"uy\");\n for (const entry of scope.kind === \"object\" ? scope.entries : []) {\n matcher.lastIndex = entry;\n if (matcher.test(source)) {\n return { index: entry, next: matcher.lastIndex };\n }\n }\n return undefined;\n};\n\n/** The element at `position` of an array literal; a block can't be indexed. */\nconst findElement = (scope: Scope, position: number): Step | undefined => {\n const index = scope.kind === \"array\" ? scope.entries[position] : undefined;\n return index === undefined ? undefined : { index, next: index };\n};\n\n/**\n * Best-effort source position for a Zod issue path (e.g. `[\"seo\", \"title\"]`,\n * `[\"redirects\", 2, \"status\"]`) in the raw config / frontmatter text. Narrows\n * segment by segment: a key is found among its parent's own entries (or, where\n * there are no brackets, in the parent's indented lines), an index picks that\n * element of an array literal. A segment that isn't there — a missing key —\n * stops the walk at its parent, so the position never escapes into a sibling.\n * Returns 1-based line/column, or undefined when not even the first segment\n * matches.\n */\nconst locatePath = (\n source: string,\n path: readonly (string | number)[]\n): { column: number; line: number } | undefined => {\n let scope: Scope = {\n end: source.length,\n entries: [],\n kind: \"block\",\n start: 0,\n };\n let found = -1;\n for (const segment of path) {\n const step = isKeySegment(segment)\n ? findKey(source, scope, segment)\n : findElement(scope, segment);\n if (!step) {\n break;\n }\n found = step.index;\n scope = valueScope(source, step, scope.end);\n }\n if (found < 0) {\n return;\n }\n const before = source.slice(0, found);\n const lastNewline = before.lastIndexOf(\"\\n\");\n return { column: found - lastNewline, line: before.split(\"\\n\").length };\n};\n\n/** The YAML front matter block of a `.md`/`.mdx` source, if it has one. */\nconst FRONTMATTER = /^---\\r?\\n(?<body>[\\s\\S]*?)\\r?\\n---/u;\n\n/**\n * Locate a front matter key in a content file, e.g. `[\"seo\", \"description\"]` in\n * `docs/api.mdx`. Scoped to the front matter block so a `title:` written in the\n * page body can't be mistaken for the front matter key of the same name; returns\n * undefined when the file has no front matter or the key isn't set (a missing\n * key has no line to point at — callers anchor to the file instead).\n */\nexport const locateFrontmatterKey = (\n source: string,\n path: readonly (string | number)[]\n): { column: number; line: number } | undefined => {\n const block = FRONTMATTER.exec(source);\n if (!block) {\n return;\n }\n // `locatePath` reports lines 1-based within the text it was given, and the\n // front matter body starts one line below the opening `---`.\n const position = locatePath(block.groups?.body ?? \"\", path);\n return position && { column: position.column, line: position.line + 1 };\n};\n\n/**\n * Convert generic validation issues (message + path, the shape shared by Zod\n * and Standard Schema issues) into Blume diagnostics, anchored to a file.\n */\nexport const diagnosticsFromIssues = (\n issues: readonly {\n message: string;\n path: readonly (string | number)[];\n }[],\n options: { code: string; file?: string; source?: string }\n): Diagnostic[] =>\n issues.map((issue) => {\n const schemaPath = issue.path.join(\".\");\n const position = options.source\n ? locatePath(options.source, issue.path)\n : undefined;\n return {\n code: options.code,\n column: position?.column,\n file: options.file,\n line: position?.line,\n message: schemaPath ? `${schemaPath}: ${issue.message}` : issue.message,\n schemaPath: schemaPath || undefined,\n severity: \"error\",\n } satisfies Diagnostic;\n });\n\n/** Convert a ZodError into Blume diagnostics, anchored to a file. */\nexport const diagnosticsFromZod = (\n error: ZodError,\n options: { code: string; file?: string; source?: string }\n): Diagnostic[] =>\n diagnosticsFromIssues(\n error.issues.map((issue) => ({\n message: issue.message,\n // Zod 4 paths are PropertyKey[]; a symbol segment has no place in a\n // dotted schema path or a source-position scan.\n path: issue.path.filter(\n (segment): segment is string | number => typeof segment !== \"symbol\"\n ),\n })),\n options\n );\n\nconst severityColor = (severity: Diagnostic[\"severity\"]) => {\n if (severity === \"error\") {\n return colors.red;\n }\n if (severity === \"warning\") {\n return colors.yellow;\n }\n return colors.blue;\n};\n\n/** Format a single diagnostic for terminal output. */\nexport const formatDiagnostic = (\n diagnostic: Diagnostic,\n root?: string\n): string => {\n const color = severityColor(diagnostic.severity);\n const lines: string[] = [\n `${color(colors.bold(diagnostic.code))} ${diagnostic.message}`,\n ];\n\n // An audit finding is about a built URL, and names the source file that fixes\n // it as a second line (\"at /docs/api\" / \"in docs/api.mdx:3:2\"). Everything\n // else is about a file alone, and keeps the original single `at file` line.\n if (diagnostic.url) {\n lines.push(` ${colors.dim(`at ${diagnostic.url}`)}`);\n }\n if (diagnostic.file) {\n const location = root ? relative(root, diagnostic.file) : diagnostic.file;\n const column =\n diagnostic.column === undefined ? \"\" : `:${diagnostic.column}`;\n const position =\n diagnostic.line === undefined ? \"\" : `:${diagnostic.line}${column}`;\n const label = diagnostic.url ? \"in\" : \"at\";\n lines.push(` ${colors.dim(`${label} ${location}${position}`)}`);\n }\n\n if (diagnostic.suggestion) {\n lines.push(` ${colors.cyan(`fix: ${diagnostic.suggestion}`)}`);\n }\n\n if (diagnostic.docsUrl) {\n lines.push(` ${colors.dim(`docs: ${diagnostic.docsUrl}`)}`);\n }\n\n return lines.join(\"\\n\");\n};\n\nexport const hasErrors = (diagnostics: Diagnostic[]): boolean =>\n diagnostics.some((d) => d.severity === \"error\");\n\nexport const countBySeverity = (diagnostics: Diagnostic[]) => {\n const counts = { error: 0, info: 0, warning: 0 } satisfies Record<\n Diagnostic[\"severity\"],\n number\n >;\n for (const diagnostic of diagnostics) {\n counts[diagnostic.severity] += 1;\n }\n return counts;\n};\n",
|
|
12
|
+
"import { colors } from \"consola/utils\";\nimport { relative } from \"pathe\";\nimport type { ZodError } from \"zod\";\n\nimport type { Diagnostic } from \"./types.ts\";\n\n/** A recoverable error carrying a structured diagnostic. */\nexport class BlumeError extends Error {\n readonly diagnostic: Diagnostic;\n\n constructor(diagnostic: Diagnostic) {\n super(diagnostic.message);\n this.name = \"BlumeError\";\n this.diagnostic = diagnostic;\n }\n}\n\nexport const createDiagnostic = (diagnostic: Diagnostic): Diagnostic =>\n diagnostic;\n\n/** Docs site base; diagnostic help links resolve against it. */\nconst DOCS_BASE = \"https://useblume.dev\";\n\nconst DOCS_DEPLOYMENT = \"/docs/deployment\";\nconst DOCS_CLI_VALIDATE = \"/docs/cli/validate\";\nconst DOCS_CONTENT_SOURCES = \"/docs/content/sources\";\nconst DOCS_CONTENT_SOURCES_OBSIDIAN = \"/docs/content/sources/obsidian\";\nconst DOCS_CONTENT_NAVIGATION = \"/docs/content/navigation\";\nconst DOCS_CONTENT_INCLUDES = \"/docs/content/includes\";\n\n/** Diagnostic code → the docs page that explains it. */\nconst DOCS_PATHS = new Map(\n Object.entries({\n BLUME_ADAPTER_REQUIRED: DOCS_DEPLOYMENT,\n BLUME_ASSETS_UNCHECKED: DOCS_CLI_VALIDATE,\n BLUME_ASSET_FETCH_FAILED: DOCS_CONTENT_SOURCES,\n BLUME_BROKEN_ANCHOR: DOCS_CLI_VALIDATE,\n BLUME_BROKEN_ASSET: DOCS_CLI_VALIDATE,\n BLUME_BROKEN_LINK: DOCS_CLI_VALIDATE,\n BLUME_COMPONENTS_INVALID: \"/docs/configuration/customization\",\n BLUME_CONFIG_INVALID: \"/docs/configuration\",\n BLUME_CONFIG_LOAD_FAILED: \"/docs/configuration\",\n BLUME_CONTENT_ROOT_MISSING: DOCS_CONTENT_SOURCES,\n BLUME_DEAD_LINK: DOCS_CLI_VALIDATE,\n BLUME_DEPENDENCY_MISSING: \"/docs/cli/doctor\",\n BLUME_DUPLICATE_ROUTE: DOCS_CONTENT_NAVIGATION,\n BLUME_DUPLICATE_SIDEBAR_ORDER: DOCS_CONTENT_NAVIGATION,\n BLUME_EXAMPLE_NOT_FOUND: \"/docs/content/components#component\",\n BLUME_FRONTMATTER_INVALID: \"/docs/content/frontmatter\",\n BLUME_INCLUDE_CYCLE: DOCS_CONTENT_INCLUDES,\n BLUME_INCLUDE_MALFORMED: DOCS_CONTENT_INCLUDES,\n BLUME_INCLUDE_NOT_FOUND: DOCS_CONTENT_INCLUDES,\n BLUME_INCLUDE_OUTSIDE_ROOT: DOCS_CONTENT_INCLUDES,\n BLUME_MDX_CURLY_ANCHOR: \"/docs/content/syntax\",\n\n BLUME_META_INVALID: \"/docs/content/meta\",\n BLUME_META_LOAD_FAILED: \"/docs/content/meta\",\n BLUME_MISSING_SECRET: DOCS_DEPLOYMENT,\n BLUME_NAV_DUPLICATE_LABEL: DOCS_CONTENT_NAVIGATION,\n BLUME_NAV_HIDDEN_IN_SIDEBAR: DOCS_CONTENT_NAVIGATION,\n BLUME_NAV_INDEX_TITLE_MISMATCH: DOCS_CONTENT_NAVIGATION,\n BLUME_NAV_MISSING_PAGE: DOCS_CONTENT_NAVIGATION,\n BLUME_NODE_VERSION: \"/docs/quickstart\",\n BLUME_SEARCH_SYNC_FAILED: \"/docs/configuration/search\",\n BLUME_SERVER_FEATURE_REQUIRED: DOCS_DEPLOYMENT,\n BLUME_SIDEBAR_DISPLAY_IGNORED: DOCS_CONTENT_NAVIGATION,\n BLUME_SOURCE_FETCH_FAILED: DOCS_CONTENT_SOURCES,\n BLUME_SOURCE_MISCONFIGURED: DOCS_CONTENT_SOURCES,\n BLUME_SOURCE_OFFLINE: DOCS_CONTENT_SOURCES,\n BLUME_SOURCE_PATH_MISSING: \"/docs/content/sources/remote-mdx\",\n BLUME_SOURCE_SDK_MISSING: DOCS_CONTENT_SOURCES,\n BLUME_SOURCE_UNAVAILABLE: DOCS_CONTENT_SOURCES,\n BLUME_SOURCE_UNRESOLVED_LINK: \"/docs/content/sources/contentful\",\n BLUME_SOURCE_UNSUPPORTED_NODE: \"/docs/content/sources/payload\",\n BLUME_TRANSLATE_MISSING: \"/docs/cli/translate\",\n BLUME_TRANSLATE_STALE: \"/docs/cli/translate\",\n BLUME_UNKNOWN_COMPONENT: \"/docs/configuration/customization\",\n BLUME_UNKNOWN_DIRECTIVE: \"/docs/content/syntax\",\n BLUME_UNKNOWN_ICON: DOCS_CONTENT_NAVIGATION,\n BLUME_UNKNOWN_OPTION: \"/docs/cli\",\n BLUME_UNLOADABLE_FILE_NAME: \"/docs/content\",\n BLUME_WIKILINK_AMBIGUOUS: DOCS_CONTENT_SOURCES_OBSIDIAN,\n BLUME_WIKILINK_UNRESOLVED: DOCS_CONTENT_SOURCES_OBSIDIAN,\n BLUME_YARN_PNP: \"/docs/quickstart\",\n })\n);\n\n/** The docs URL that explains a diagnostic code, if one is mapped. */\nexport const resolveDocsUrl = (code: string): string | undefined => {\n const path = DOCS_PATHS.get(code);\n return path ? `${DOCS_BASE}${path}` : undefined;\n};\n\n/** Fill in `docsUrl` from the code map where a diagnostic doesn't set its own. */\nexport const enrichDiagnostic = (diagnostic: Diagnostic): Diagnostic =>\n diagnostic.docsUrl\n ? diagnostic\n : { ...diagnostic, docsUrl: resolveDocsUrl(diagnostic.code) };\n\nconst REGEXP_SPECIAL = /[$()*+.?[\\\\\\]^{|}]/gu;\nconst escapeRegExp = (value: string): string =>\n value.replaceAll(REGEXP_SPECIAL, String.raw`\\$&`);\n\n/** A key segment scans the source text; an array index has no key to find. */\nconst isKeySegment = (segment: string | number): segment is string =>\n typeof segment === \"string\";\n\n/**\n * Where a located value's children are searched. `object` and `array` are the\n * inside of a `{…}`/`[…]` literal, searched entry by entry so a key or an index\n * only matches a direct child. `block` has no brackets — the whole file at the\n * top, or a YAML key's indented lines — and is searched at any depth.\n */\ninterface Scope {\n end: number;\n /** A literal's direct entries (keys or elements), in source order. */\n entries: number[];\n kind: \"array\" | \"block\" | \"object\";\n start: number;\n}\n\n/** A located key or element: where it starts, and where its value starts. */\ninterface Step {\n index: number;\n next: number;\n}\n\nconst QUOTES = new Set(['\"', \"'\", \"`\"]);\nconst OPENERS = new Set([\"(\", \"[\", \"{\"]);\nconst CLOSERS = new Set([\")\", \"]\", \"}\"]);\nconst WHITESPACE = /\\s/u;\n\n/**\n * The index just past a comment starting at `index`, or `index` when none does.\n * A `//` after a `:` is a URL scheme in YAML (`href: https://…`), not a comment.\n */\nconst skipComment = (source: string, index: number): number => {\n if (source.startsWith(\"//\", index) && source.charAt(index - 1) !== \":\") {\n const end = source.indexOf(\"\\n\", index);\n return end === -1 ? source.length : end;\n }\n if (source.startsWith(\"/*\", index)) {\n const end = source.indexOf(\"*/\", index + 2);\n return end === -1 ? source.length : end + 2;\n }\n return index;\n};\n\n/**\n * The index just past a string literal starting at `index`, or `index` when\n * none does. A `'`/`\"` that doesn't close on its own line is an apostrophe in\n * plain YAML text, not a string.\n */\nconst skipString = (source: string, index: number): number => {\n const quote = source.charAt(index);\n if (!QUOTES.has(quote)) {\n return index;\n }\n let cursor = index + 1;\n while (cursor < source.length) {\n const char = source.charAt(cursor);\n if (char === quote) {\n return cursor + 1;\n }\n if (char === \"\\n\" && quote !== \"`\") {\n return index;\n }\n cursor += char === \"\\\\\" ? 2 : 1;\n }\n return index;\n};\n\n/** Where a literal closes, and where each of its direct entries starts. */\ninterface LiteralScan {\n end: number;\n entries: number[];\n}\n\n/**\n * Walk the `{…}`/`[…]` literal opened at `open`: where each direct entry starts\n * (a key, or an array element) and where the literal closes. Nested brackets,\n * strings, and comments are stepped over, so only the literal's own commas\n * separate its entries.\n */\nconst scanLiteral = (source: string, open: number): LiteralScan => {\n const entries: number[] = [];\n let depth = 0;\n let pending = true;\n let index = open + 1;\n while (index < source.length) {\n const afterComment = skipComment(source, index);\n const char = source.charAt(index);\n if (afterComment !== index || WHITESPACE.test(char)) {\n index = Math.max(afterComment, index + 1);\n continue;\n }\n if (depth === 0 && CLOSERS.has(char)) {\n return { end: index, entries };\n }\n if (depth === 0 && pending) {\n entries.push(index);\n pending = false;\n }\n const afterString = skipString(source, index);\n if (afterString !== index) {\n index = afterString;\n continue;\n }\n if (OPENERS.has(char)) {\n depth += 1;\n } else if (CLOSERS.has(char)) {\n depth -= 1;\n } else if (char === \",\" && depth === 0) {\n pending = true;\n }\n index += 1;\n }\n return { end: source.length, entries };\n};\n\n/**\n * The lines indented deeper than the key at `anchor` — a YAML mapping's\n * children — up to the first line that isn't, or `limit`.\n */\nconst indentedBlock = (\n source: string,\n anchor: number,\n limit: number\n): Scope => {\n const column = anchor - (source.lastIndexOf(\"\\n\", anchor - 1) + 1);\n const lineEnd = source.indexOf(\"\\n\", anchor);\n const start = lineEnd === -1 ? limit : Math.min(lineEnd + 1, limit);\n let end = start;\n while (end < limit) {\n const next = source.indexOf(\"\\n\", end);\n const after = next === -1 || next >= limit ? limit : next + 1;\n const line = source.slice(end, after);\n if (line.trim() !== \"\" && line.length - line.trimStart().length <= column) {\n break;\n }\n end = after;\n }\n return { end, entries: [], kind: \"block\", start };\n};\n\n/** A value's lead-in before its literal: spaces, or an adapter call's `vercel(`. */\nconst VALUE_LEAD = /[\\s\\w$.(]*/uy;\n\n/**\n * The scope holding the children of the key or element at `anchor`, whose\n * value starts at `from`. A `{…}`/`[…]` literal — written directly, or as the\n * first argument of a call like `vercel({…})` — is walked entry by entry;\n * anything else falls back to the lines indented under `anchor` (YAML's\n * nesting), within the enclosing scope's `limit`.\n */\nconst valueScope = (source: string, step: Step, limit: number): Scope => {\n VALUE_LEAD.lastIndex = step.next;\n VALUE_LEAD.exec(source);\n const open = VALUE_LEAD.lastIndex;\n const char = source.charAt(open);\n if (open < limit && (char === \"{\" || char === \"[\")) {\n const literal = scanLiteral(source, open);\n return {\n end: literal.end,\n entries: literal.entries,\n kind: char === \"{\" ? \"object\" : \"array\",\n start: open,\n };\n }\n return indentedBlock(source, step.index, limit);\n};\n\n/**\n * Find `segment` as a `key:`/`key =` (bare or quoted) in `scope`: among an\n * object literal's own entries, or anywhere in a block. The negative lookbehind\n * keeps `title` from matching the tail of an unrelated key such as `subtitle:`.\n */\nconst findKey = (\n source: string,\n scope: Scope,\n segment: string\n): Step | undefined => {\n const key = escapeRegExp(segment);\n const pattern = `(?<![\\\\w$])(?:${key}|\"${key}\"|'${key}')\\\\s*[:=]`;\n if (scope.kind === \"block\") {\n const matcher = new RegExp(pattern, \"gu\");\n matcher.lastIndex = scope.start;\n const match = matcher.exec(source);\n return match && match.index < scope.end\n ? { index: match.index, next: matcher.lastIndex }\n : undefined;\n }\n // Sticky: the key must start exactly where the entry does.\n const matcher = new RegExp(pattern, \"uy\");\n for (const entry of scope.kind === \"object\" ? scope.entries : []) {\n matcher.lastIndex = entry;\n if (matcher.test(source)) {\n return { index: entry, next: matcher.lastIndex };\n }\n }\n return undefined;\n};\n\n/** The element at `position` of an array literal; a block can't be indexed. */\nconst findElement = (scope: Scope, position: number): Step | undefined => {\n const index = scope.kind === \"array\" ? scope.entries[position] : undefined;\n return index === undefined ? undefined : { index, next: index };\n};\n\n/**\n * Best-effort source position for a Zod issue path (e.g. `[\"seo\", \"title\"]`,\n * `[\"redirects\", 2, \"status\"]`) in the raw config / frontmatter text. Narrows\n * segment by segment: a key is found among its parent's own entries (or, where\n * there are no brackets, in the parent's indented lines), an index picks that\n * element of an array literal. A segment that isn't there — a missing key —\n * stops the walk at its parent, so the position never escapes into a sibling.\n * Returns 1-based line/column, or undefined when not even the first segment\n * matches.\n */\nconst locatePath = (\n source: string,\n path: readonly (string | number)[]\n): { column: number; line: number } | undefined => {\n let scope: Scope = {\n end: source.length,\n entries: [],\n kind: \"block\",\n start: 0,\n };\n let found = -1;\n for (const segment of path) {\n const step = isKeySegment(segment)\n ? findKey(source, scope, segment)\n : findElement(scope, segment);\n if (!step) {\n break;\n }\n found = step.index;\n scope = valueScope(source, step, scope.end);\n }\n if (found < 0) {\n return;\n }\n const before = source.slice(0, found);\n const lastNewline = before.lastIndexOf(\"\\n\");\n return { column: found - lastNewline, line: before.split(\"\\n\").length };\n};\n\n/** The YAML front matter block of a `.md`/`.mdx` source, if it has one. */\nconst FRONTMATTER = /^---\\r?\\n(?<body>[\\s\\S]*?)\\r?\\n---/u;\n\n/**\n * Locate a front matter key in a content file, e.g. `[\"seo\", \"description\"]` in\n * `docs/api.mdx`. Scoped to the front matter block so a `title:` written in the\n * page body can't be mistaken for the front matter key of the same name; returns\n * undefined when the file has no front matter or the key isn't set (a missing\n * key has no line to point at — callers anchor to the file instead).\n */\nexport const locateFrontmatterKey = (\n source: string,\n path: readonly (string | number)[]\n): { column: number; line: number } | undefined => {\n const block = FRONTMATTER.exec(source);\n if (!block) {\n return;\n }\n // `locatePath` reports lines 1-based within the text it was given, and the\n // front matter body starts one line below the opening `---`.\n const position = locatePath(block.groups?.body ?? \"\", path);\n return position && { column: position.column, line: position.line + 1 };\n};\n\n/**\n * Convert generic validation issues (message + path, the shape shared by Zod\n * and Standard Schema issues) into Blume diagnostics, anchored to a file.\n */\nexport const diagnosticsFromIssues = (\n issues: readonly {\n message: string;\n path: readonly (string | number)[];\n }[],\n options: { code: string; file?: string; source?: string }\n): Diagnostic[] =>\n issues.map((issue) => {\n const schemaPath = issue.path.join(\".\");\n const position = options.source\n ? locatePath(options.source, issue.path)\n : undefined;\n return {\n code: options.code,\n column: position?.column,\n file: options.file,\n line: position?.line,\n message: schemaPath ? `${schemaPath}: ${issue.message}` : issue.message,\n schemaPath: schemaPath || undefined,\n severity: \"error\",\n } satisfies Diagnostic;\n });\n\n/** Convert a ZodError into Blume diagnostics, anchored to a file. */\nexport const diagnosticsFromZod = (\n error: ZodError,\n options: { code: string; file?: string; source?: string }\n): Diagnostic[] =>\n diagnosticsFromIssues(\n error.issues.map((issue) => ({\n message: issue.message,\n // Zod 4 paths are PropertyKey[]; a symbol segment has no place in a\n // dotted schema path or a source-position scan.\n path: issue.path.filter(\n (segment): segment is string | number => typeof segment !== \"symbol\"\n ),\n })),\n options\n );\n\nconst severityColor = (severity: Diagnostic[\"severity\"]) => {\n if (severity === \"error\") {\n return colors.red;\n }\n if (severity === \"warning\") {\n return colors.yellow;\n }\n return colors.blue;\n};\n\n/** Format a single diagnostic for terminal output. */\nexport const formatDiagnostic = (\n diagnostic: Diagnostic,\n root?: string\n): string => {\n const color = severityColor(diagnostic.severity);\n const lines: string[] = [\n `${color(colors.bold(diagnostic.code))} ${diagnostic.message}`,\n ];\n\n // An audit finding is about a built URL, and names the source file that fixes\n // it as a second line (\"at /docs/api\" / \"in docs/api.mdx:3:2\"). Everything\n // else is about a file alone, and keeps the original single `at file` line.\n if (diagnostic.url) {\n lines.push(` ${colors.dim(`at ${diagnostic.url}`)}`);\n }\n if (diagnostic.file) {\n const location = root ? relative(root, diagnostic.file) : diagnostic.file;\n const column =\n diagnostic.column === undefined ? \"\" : `:${diagnostic.column}`;\n const position =\n diagnostic.line === undefined ? \"\" : `:${diagnostic.line}${column}`;\n const label = diagnostic.url ? \"in\" : \"at\";\n lines.push(` ${colors.dim(`${label} ${location}${position}`)}`);\n }\n\n if (diagnostic.suggestion) {\n lines.push(` ${colors.cyan(`fix: ${diagnostic.suggestion}`)}`);\n }\n\n if (diagnostic.docsUrl) {\n lines.push(` ${colors.dim(`docs: ${diagnostic.docsUrl}`)}`);\n }\n\n return lines.join(\"\\n\");\n};\n\nexport const hasErrors = (diagnostics: Diagnostic[]): boolean =>\n diagnostics.some((d) => d.severity === \"error\");\n\nexport const countBySeverity = (diagnostics: Diagnostic[]) => {\n const counts = { error: 0, info: 0, warning: 0 } satisfies Record<\n Diagnostic[\"severity\"],\n number\n >;\n for (const diagnostic of diagnostics) {\n counts[diagnostic.severity] += 1;\n }\n return counts;\n};\n",
|
|
13
13
|
"import { consola } from \"consola\";\nimport { relative } from \"pathe\";\n\nimport {\n countBySeverity,\n enrichDiagnostic,\n formatDiagnostic,\n hasErrors,\n} from \"../core/diagnostics.ts\";\nimport type { Diagnostic } from \"../core/types.ts\";\n\nexport const logger = consola.withTag(\"blume\");\n\n/**\n * Resolve once stdout has drained. `process.exit` doesn't flush a piped stdout,\n * so await this before exiting non-zero after writing machine-readable output\n * (e.g. `--json`), otherwise the payload can be truncated in CI.\n */\nexport const flushStdout = (): Promise<void> =>\n // oxlint-disable-next-line promise/avoid-new -- adapt stdout's write callback\n new Promise((resolve) => {\n process.stdout.write(\"\", () => resolve());\n });\n\n/**\n * Print diagnostics as a JSON document on stdout for CI and editors: each is\n * enriched with its `docsUrl` and its `file` made root-relative. Returns whether\n * any were errors, matching {@link reportDiagnostics}.\n */\nexport const reportDiagnosticsJson = (\n diagnostics: Diagnostic[],\n root?: string\n): boolean => {\n const enriched = diagnostics.map((diagnostic) => {\n const withDocs = enrichDiagnostic(diagnostic);\n return withDocs.file && root\n ? { ...withDocs, file: relative(root, withDocs.file) }\n : withDocs;\n });\n process.stdout.write(\n `${JSON.stringify(\n { diagnostics: enriched, summary: countBySeverity(diagnostics) },\n null,\n 2\n )}\\n`\n );\n return hasErrors(diagnostics);\n};\n\n/** Print a batch of diagnostics and return whether any were errors. */\nexport const reportDiagnostics = (\n diagnostics: Diagnostic[],\n root?: string\n): boolean => {\n if (diagnostics.length === 0) {\n return false;\n }\n\n for (const diagnostic of diagnostics) {\n process.stderr.write(\n `${formatDiagnostic(enrichDiagnostic(diagnostic), root)}\\n`\n );\n }\n\n const counts = countBySeverity(diagnostics);\n const summary = [\n counts.error ? `${counts.error} error(s)` : null,\n counts.warning ? `${counts.warning} warning(s)` : null,\n ]\n .filter(Boolean)\n .join(\", \");\n if (summary) {\n process.stderr.write(`\\n${summary}\\n`);\n }\n\n return hasErrors(diagnostics);\n};\n",
|
|
14
14
|
"import type { ArgsDef } from \"citty\";\n\nimport type { Diagnostic } from \"../core/types.ts\";\n\n/** A flag the command doesn't declare, with the declared one it most resembles. */\nexport interface UnknownFlag {\n /** The flag as typed, without any `=value`. */\n flag: string;\n /** The closest declared flag (`--isolated` for `--isolatd`), if one is close. */\n suggestion?: string;\n}\n\n/** What a declared option spelling means for the token that follows it. */\ninterface KnownFlag {\n /** Whether it's a boolean switch, which `--no-<name>` turns off. */\n boolean: boolean;\n /**\n * How the flags a command takes list it: `--kebab-name`, or `--no-<name>`\n * for a boolean that's on by default, since that's the form anyone types.\n */\n display: string;\n /** The canonical kebab-case name, which typos are matched against. */\n name: string;\n /** Whether it reads the next token as its value (`--port 4000`). */\n takesValue: boolean;\n}\n\n/** `budgetJs` → `budget-js`; a name already in kebab case is unchanged. */\nconst kebabCase = (name: string): string =>\n name.replaceAll(/(?<upper>[A-Z])/gu, (letter) => `-${letter.toLowerCase()}`);\n\n/** `budget-js` → `budgetJs`; a name already in camel case is unchanged. */\nconst camelCase = (name: string): string =>\n name.replaceAll(/-(?<letter>[a-z])/gu, (match) =>\n match.slice(1).toUpperCase()\n );\n\nconst aliasesOf = (alias: string | string[] | undefined): string[] => {\n if (alias === undefined) {\n return [];\n }\n return Array.isArray(alias) ? alias : [alias];\n};\n\n/**\n * Every spelling citty accepts for each declared option — the name, its camel\n * and kebab forms, and its aliases — mapped to what that option is. Positional\n * arguments aren't flags and don't appear.\n */\nconst knownFlags = (argsDef: ArgsDef): Map<string, KnownFlag> => {\n const flags = new Map<string, KnownFlag>();\n for (const [name, def] of Object.entries(argsDef)) {\n if (def.type === \"positional\") {\n continue;\n }\n const kebab = kebabCase(name);\n const boolean = def.type === \"boolean\";\n const onByDefault = boolean && \"default\" in def && def.default === true;\n const flag = {\n boolean,\n display: onByDefault ? `--no-${kebab}` : `--${kebab}`,\n name: kebab,\n takesValue: def.type === \"string\" || def.type === \"enum\",\n };\n for (const spelling of [\n name,\n kebabCase(name),\n camelCase(name),\n ...aliasesOf(\"alias\" in def ? def.alias : undefined),\n ]) {\n flags.set(spelling, flag);\n }\n }\n return flags;\n};\n\n/** Edit distance between two short strings (insertions, deletions, swaps of one letter). */\nconst distance = (from: string, to: string): number => {\n let previous = Array.from({ length: to.length + 1 }, (_, index) => index);\n for (const [row, fromChar] of [...from].entries()) {\n const current = [row + 1];\n for (const [column, toChar] of [...to].entries()) {\n current.push(\n Math.min(\n (previous[column + 1] ?? 0) + 1,\n (current[column] ?? 0) + 1,\n (previous[column] ?? 0) + (fromChar === toChar ? 0 : 1)\n )\n );\n }\n previous = current;\n }\n return previous[to.length] ?? 0;\n};\n\n/**\n * The candidate closest to `name`, when it's close enough to be the likely\n * intent: at most two edits away, and fewer edits than half the candidate's\n * length, so a short typo doesn't \"suggest\" an unrelated short word.\n */\nexport const closestMatch = (\n name: string,\n candidates: readonly string[]\n): string | undefined => {\n let best: { candidate: string; edits: number } | undefined;\n for (const candidate of candidates) {\n const edits = distance(name, candidate);\n if (\n edits <= 2 &&\n edits * 2 < candidate.length &&\n (best === undefined || edits < best.edits)\n ) {\n best = { candidate, edits };\n }\n }\n return best?.candidate;\n};\n\n/** A `--name`, `--no-name`, `--name=value`, or `-n` token, taken apart. */\ninterface FlagToken {\n /** Whether it carries its value inline (`--port=4000`). */\n hasValue: boolean;\n /** `--name` rather than `-n`. */\n long: boolean;\n /** The name as typed, without dashes or `=value`. */\n name: string;\n /** The negated flag's name, for a `--no-name` token. */\n negated: string | undefined;\n}\n\nconst parseToken = (arg: string): FlagToken => {\n const long = arg.startsWith(\"--\");\n const [name = \"\"] = arg.slice(long ? 2 : 1).split(\"=\");\n return {\n hasValue: arg.includes(\"=\"),\n long,\n name,\n negated: long && name.startsWith(\"no-\") ? name.slice(3) : undefined,\n };\n};\n\n/**\n * How many tokens after this one a declared flag consumes — one for a string\n * flag's separate value (`--port 4000`, read whatever it looks like, as\n * citty's parser does), none otherwise — or undefined when the token names no\n * declared flag. A negation never reads a value; grouped single-letter\n * booleans (`-ab`) are declared when every letter is.\n */\nconst declaredWidth = (\n token: FlagToken,\n flags: Map<string, KnownFlag>\n): number | undefined => {\n const known =\n flags.get(token.name) ??\n (token.negated === undefined ? undefined : flags.get(token.negated));\n if (known) {\n return known.takesValue && !token.hasValue && token.negated === undefined\n ? 1\n : 0;\n }\n const grouped =\n !token.long &&\n token.name.length > 1 &&\n [...token.name].every((letter) => flags.get(letter)?.takesValue === false);\n return grouped ? 0 : undefined;\n};\n\n/**\n * An undeclared token as reported, with the declared flag it most resembles.\n * A mistyped negation keeps its `no-` in the suggestion (`--no-instal` →\n * `--no-install`), so the fix doesn't flip what was asked for; negating a flag\n * that takes a value means nothing, so those suggest the flag itself.\n */\nconst describeUnknown = (\n token: FlagToken,\n flags: Map<string, KnownFlag>\n): UnknownFlag => {\n const unknown: UnknownFlag = {\n flag: `${token.long ? \"--\" : \"-\"}${token.name}`,\n };\n const names = [...new Set([...flags.values()].map((flag) => flag.name))];\n const match = closestMatch(token.negated ?? token.name, names);\n if (match) {\n const negate = token.negated !== undefined && flags.get(match)?.boolean;\n unknown.suggestion = negate ? `--no-${match}` : `--${match}`;\n }\n return unknown;\n};\n\n/**\n * The flags in `rawArgs` that the command's `args` don't declare. citty itself\n * accepts any flag and drops the ones it doesn't know, so a typo like\n * `--isolatd` would silently run a different command than the one intended.\n *\n * Mirrors what citty accepts: every spelling from {@link knownFlags}, a\n * `--no-<flag>` negation of any of them, `--flag=value`, a declared string\n * flag's separate value token, grouped single-letter boolean aliases, and\n * everything after a bare `--`. `accepted` names extra flags the command\n * handles itself (the removed `blume build --adapter`, which gets its own\n * migration message).\n */\nexport const unknownFlags = (\n rawArgs: readonly string[],\n argsDef: ArgsDef,\n accepted: readonly string[] = []\n): UnknownFlag[] => {\n const flags = knownFlags(argsDef);\n const unknown: UnknownFlag[] = [];\n for (let index = 0; index < rawArgs.length; index += 1) {\n const arg = rawArgs[index] ?? \"\";\n if (arg === \"--\") {\n break;\n }\n if (!arg.startsWith(\"-\") || arg === \"-\") {\n continue;\n }\n const token = parseToken(arg);\n const width = declaredWidth(token, flags);\n if (width !== undefined) {\n index += width;\n } else if (!accepted.includes(token.negated ?? token.name)) {\n unknown.push(describeUnknown(token, flags));\n }\n }\n return unknown;\n};\n\n/**\n * Flags a command reads from its raw arguments itself instead of declaring\n * them, keyed by command name. `blume build` answers the Blume 1 `--adapter`,\n * `--output`, and `--base` with the `deployment` setting that replaced each,\n * which says more than \"unknown option\" would.\n */\nexport const COMMAND_HANDLED_FLAGS = new Map([\n [\"build\", [\"adapter\", \"output\", \"base\"]],\n]);\n\n/**\n * The error for a command run with flags it doesn't declare: each unknown\n * flag (with its likely intended spelling), then every flag the command does\n * take, so the fix is on screen without a trip to `--help`.\n */\nexport const unknownFlagsDiagnostic = (\n command: string,\n unknown: readonly UnknownFlag[],\n argsDef: ArgsDef\n): Diagnostic => {\n const listed = unknown\n .map(({ flag, suggestion }) =>\n suggestion ? `${flag} (did you mean ${suggestion}?)` : flag\n )\n .join(\", \");\n const declared = [\n ...new Set([...knownFlags(argsDef).values()].map((flag) => flag.display)),\n ].toSorted();\n const takes =\n declared.length > 0\n ? `It takes ${declared.join(\", \")}.`\n : \"It takes no options.\";\n return {\n code: \"BLUME_UNKNOWN_OPTION\",\n message: `blume ${command} doesn't know ${unknown.length === 1 ? \"the option\" : \"the options\"} ${listed}.`,\n severity: \"error\",\n suggestion: `${takes} Run \\`blume ${command} --help\\` for what each does.`,\n };\n};\n",
|
|
15
15
|
"import type { ArgsDef, CommandDef, CommandMeta } from \"citty\";\n\nimport { BlumeError } from \"../core/diagnostics.ts\";\nimport { reportInternalError } from \"./internal-error.ts\";\nimport { reportDiagnostics } from \"./log.ts\";\nimport {\n COMMAND_HANDLED_FLAGS,\n unknownFlags,\n unknownFlagsDiagnostic,\n} from \"./unknown-flags.ts\";\n\n/**\n * Wrap a command so its module is imported only when citty needs its `args`\n * or runs it. `meta` stays static (from `command-meta.ts`), so rendering root\n * usage, matching an unknown name, and `blume <cmd> --help` for *another*\n * command never touch this one's dependency graph.\n *\n * `load` imports the command's module and `key` names its export, so the call\n * site stays a plain `() => import(\"./commands/x.ts\")`.\n *\n * Only `args`, `setup`, `run`, and `cleanup` are forwarded: no Blume command\n * declares `default`, `plugins`, or nested `subCommands`.\n *\n * Two behaviors every command shares live here rather than in each command:\n * `setup` rejects flags the command doesn't declare (citty accepts and drops\n * them, so `blume build --isolatd` would run a real, non-isolated build), and\n * `run` reports a {@link BlumeError} a command lets escape — a config that\n * fails validation, say — as its diagnostic instead of citty's raw stack dump.\n */\nexport const lazyCommand = <Args extends ArgsDef, Key extends string>(\n meta: CommandMeta,\n load: () => Promise<Record<Key, CommandDef<Args>>>,\n key: Key\n): CommandDef<Args> => {\n const command = async () => {\n const module = await load();\n return module[key];\n };\n const name = meta.name ?? key;\n return {\n args: async () => {\n const { args } = await command();\n // SAFETY: every Blume command passes `args` to `defineCommand` as a plain\n // object literal (the \"command registry\" test checks it); citty's\n // `Resolvable` widening is the only reason the type also admits a thunk\n // or a promise here.\n return args as Args;\n },\n cleanup: async (context) => {\n const loaded = await command();\n await loaded.cleanup?.(context);\n },\n meta,\n run: async (context) => {\n const loaded = await command();\n try {\n await loaded.run?.(context);\n } catch (error) {\n if (error instanceof BlumeError) {\n reportDiagnostics([error.diagnostic], process.cwd());\n } else {\n reportInternalError(error);\n }\n process.exit(1);\n }\n },\n setup: async (context) => {\n const loaded = await command();\n // SAFETY: as for `args` above, every command's `args` is a plain object.\n const argsDef = (loaded.args ?? {}) as ArgsDef;\n const unknown = unknownFlags(\n context.rawArgs,\n argsDef,\n COMMAND_HANDLED_FLAGS.get(name)\n );\n if (unknown.length > 0) {\n reportDiagnostics([unknownFlagsDiagnostic(name, unknown, argsDef)]);\n process.exit(1);\n }\n await loaded.setup?.(context);\n },\n };\n};\n"
|
|
16
16
|
],
|
|
17
|
-
"mappings": "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",
|
|
18
|
-
"debugId": "
|
|
17
|
+
"mappings": "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",
|
|
18
|
+
"debugId": "D285C7A054BEC2C764756E2164756E21",
|
|
19
19
|
"names": []
|
|
20
20
|
}
|
|
@@ -9,7 +9,8 @@ export interface EmittedAgentSurface {
|
|
|
9
9
|
mcp: boolean;
|
|
10
10
|
/**
|
|
11
11
|
* A skills discovery index is served: generated from `agents.skills` (at
|
|
12
|
-
* least one valid skill)
|
|
12
|
+
* least one valid skill) or the site skill (`agents.skillMd`), or shipped
|
|
13
|
+
* by the user in `public/`.
|
|
13
14
|
*/
|
|
14
15
|
skills: boolean;
|
|
15
16
|
}
|
|
@@ -22,11 +23,11 @@ export declare const servesMcp: (project: BlumeProject, userPages: {
|
|
|
22
23
|
pattern: string;
|
|
23
24
|
}[]) => boolean;
|
|
24
25
|
/**
|
|
25
|
-
* The config the discovery documents are built from: `agents.mcp
|
|
26
|
-
* `agents.skills` switched off when the build didn't
|
|
27
|
-
* agent-readability.json, the catalogs, and the
|
|
28
|
-
* what is there. A config flag says what was asked
|
|
29
|
-
* skipped when a page owns its route, and skills
|
|
30
|
-
* directory is missing or holds no valid skill.
|
|
26
|
+
* The config the discovery documents are built from: `agents.mcp`,
|
|
27
|
+
* `agents.skills`, and `agents.skillMd` switched off when the build didn't
|
|
28
|
+
* emit them, so llms.txt, agent-readability.json, the catalogs, and the
|
|
29
|
+
* header rules only point at what is there. A config flag says what was asked
|
|
30
|
+
* for; the MCP server is skipped when a page owns its route, and skills
|
|
31
|
+
* publish nothing when their directory is missing or holds no valid skill.
|
|
31
32
|
*/
|
|
32
33
|
export declare const advertisedConfig: (config: ResolvedConfig, emitted: EmittedAgentSurface) => ResolvedConfig;
|
|
@@ -38,5 +38,12 @@ export declare const hasAiCatalog: (config: ResolvedConfig) => boolean;
|
|
|
38
38
|
* itself already sets it at runtime.
|
|
39
39
|
*/
|
|
40
40
|
export declare const crossOriginDiscoveryPaths: (config: ResolvedConfig) => string[];
|
|
41
|
+
/**
|
|
42
|
+
* The docs as "the ___" in generated prose: the title followed by `noun`,
|
|
43
|
+
* unless the title already ends in "Docs" or "Documentation" — so "Acme"
|
|
44
|
+
* reads "the Acme documentation" and "Acme Docs" reads "the Acme Docs", not
|
|
45
|
+
* "the Acme Docs docs".
|
|
46
|
+
*/
|
|
47
|
+
export declare const docsPhrase: (title: string, noun: "docs" | "documentation") => string;
|
|
41
48
|
/** The catalog document, or null when the site publishes none. */
|
|
42
49
|
export declare const buildAiCatalog: (config: ResolvedConfig, skills: readonly SkillArtifact[]) => string | null;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { buildOramaIndex } from "../search/orama-index.ts";
|
|
1
2
|
import type { OramaDoc } from "../search/orama-index.ts";
|
|
2
3
|
/** A chat message as posted by the assistant island (`{ role, content }`). */
|
|
3
4
|
export interface AskMessage {
|
|
@@ -87,6 +88,26 @@ export interface ParsedPage {
|
|
|
87
88
|
export declare const parsePage: (content: string) => ParsedPage;
|
|
88
89
|
/** {@link excerptPage} over a page parsed on the spot. Exported for testing. */
|
|
89
90
|
export declare const sectionExcerpt: (content: string, query: string, max: number) => string;
|
|
91
|
+
/** The search index over an assistant snapshot, built on first use. */
|
|
92
|
+
export declare const askIndex: (data: AskData) => ReturnType<typeof buildOramaIndex>;
|
|
93
|
+
/** The page the reader is on, and the search filters it implies. */
|
|
94
|
+
export interface ReaderScope {
|
|
95
|
+
current: OramaDoc | undefined;
|
|
96
|
+
filters: {
|
|
97
|
+
locale: string | undefined;
|
|
98
|
+
version: string | undefined;
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Where the reader is: their page, when it's in the snapshot, and the locale
|
|
103
|
+
* and docs version retrieval keeps to. A page the snapshot doesn't have (the
|
|
104
|
+
* homepage, a custom page, or none at all from a cross-origin caller) keeps
|
|
105
|
+
* to the locale its path's first segment names, or the default locale, so
|
|
106
|
+
* translations of every page don't crowd each other out. Without a page, a
|
|
107
|
+
* versioned site grounds in the current docs rather than every archived copy
|
|
108
|
+
* of each page.
|
|
109
|
+
*/
|
|
110
|
+
export declare const readerScope: (data: AskData, byRoute: ReadonlyMap<string, OramaDoc>, page?: AskPage) => ReaderScope;
|
|
90
111
|
/**
|
|
91
112
|
* Build the request-time grounding function for the assistant endpoint.
|
|
92
113
|
*
|
|
@@ -103,9 +124,14 @@ export declare const sectionExcerpt: (content: string, query: string, max: numbe
|
|
|
103
124
|
*
|
|
104
125
|
* `options.retrieval` (the `ai.assistant.retrieval` config) sizes how much
|
|
105
126
|
* documentation each question carries; omitted fields keep today's defaults.
|
|
127
|
+
*
|
|
128
|
+
* `options.tools` says the endpoint also hands the model the docs tools: the
|
|
129
|
+
* prompt then says so, and a question retrieval found nothing for still gets
|
|
130
|
+
* a grounded prompt, since the model can go and search.
|
|
106
131
|
*/
|
|
107
132
|
export declare const createAskContext: (data: AskData, options?: {
|
|
108
133
|
instructions?: string;
|
|
109
134
|
retrieval?: AskRetrievalOptions;
|
|
135
|
+
tools?: boolean;
|
|
110
136
|
}) => ((messages: AskMessage[], page?: AskPage) => Promise<string | undefined>);
|
|
111
137
|
export {};
|