blume 1.7.3 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +19 -0
- package/CHANGELOG.md +217 -0
- package/README.md +34 -21
- package/dist/cli/chunk-11j0384y.js +148 -0
- package/dist/cli/chunk-11j0384y.js.map +10 -0
- package/dist/cli/{chunk-rqy0s5wh.js → chunk-1w8dp3qb.js} +17 -16
- package/dist/cli/{chunk-rqy0s5wh.js.map → chunk-1w8dp3qb.js.map} +3 -3
- package/dist/cli/chunk-2q1dwty4.js +75 -0
- package/dist/cli/chunk-2q1dwty4.js.map +11 -0
- package/dist/cli/chunk-41za066z.js +122 -0
- package/dist/cli/chunk-41za066z.js.map +11 -0
- package/dist/cli/chunk-5a2z0198.js +133 -0
- package/dist/cli/chunk-5a2z0198.js.map +10 -0
- package/dist/cli/{chunk-5g0w1e2c.js → chunk-6k8vp3ta.js} +25 -13
- package/dist/cli/{chunk-5g0w1e2c.js.map → chunk-6k8vp3ta.js.map} +4 -4
- package/dist/cli/{chunk-5qk08vmp.js → chunk-79njf86q.js} +133 -54
- package/dist/cli/chunk-79njf86q.js.map +11 -0
- package/dist/cli/{chunk-e7f42gdj.js → chunk-7ez8ny0t.js} +2 -2
- package/dist/cli/{chunk-nn13znc2.js → chunk-88cpgt6h.js} +1 -1
- package/dist/cli/chunk-a9kptbw5.js +361 -0
- package/dist/cli/chunk-a9kptbw5.js.map +14 -0
- package/dist/cli/chunk-abh8yjkn.js +31 -0
- package/dist/cli/chunk-abh8yjkn.js.map +10 -0
- package/dist/cli/chunk-b5aj94ah.js +91 -0
- package/dist/cli/chunk-b5aj94ah.js.map +10 -0
- package/dist/cli/{chunk-b27xqwn9.js → chunk-bctazmbk.js} +9 -5
- package/dist/cli/chunk-bctazmbk.js.map +10 -0
- package/dist/cli/chunk-beat36xx.js +279 -0
- package/dist/cli/chunk-beat36xx.js.map +10 -0
- package/dist/cli/chunk-bnbmcwfb.js +145 -0
- package/dist/cli/chunk-bnbmcwfb.js.map +11 -0
- package/dist/cli/{chunk-0xjyb285.js → chunk-bw22s759.js} +15 -5
- package/dist/cli/{chunk-0xjyb285.js.map → chunk-bw22s759.js.map} +4 -4
- package/dist/cli/chunk-by2290sx.js +39 -0
- package/dist/cli/chunk-by2290sx.js.map +10 -0
- package/dist/cli/chunk-d1tadaw7.js +79 -0
- package/dist/cli/chunk-d1tadaw7.js.map +10 -0
- package/dist/cli/{chunk-ahnw3kxw.js → chunk-d80hr03s.js} +24 -19
- package/dist/cli/chunk-d80hr03s.js.map +15 -0
- package/dist/cli/chunk-ernrthtr.js +97 -0
- package/dist/cli/chunk-ernrthtr.js.map +10 -0
- package/dist/cli/chunk-f2972sbt.js +374 -0
- package/dist/cli/chunk-f2972sbt.js.map +10 -0
- package/dist/cli/{chunk-vacwm2hv.js → chunk-f7t03s3g.js} +2 -2
- package/dist/cli/{chunk-2z47ypj8.js → chunk-fa25z98p.js} +16 -3
- package/dist/cli/chunk-fa25z98p.js.map +11 -0
- package/dist/cli/{chunk-cjtn640a.js → chunk-fh5hj5jt.js} +43 -20
- package/dist/cli/chunk-fh5hj5jt.js.map +10 -0
- package/dist/cli/{chunk-yg63d42r.js → chunk-j8mw0za6.js} +86 -57
- package/dist/cli/chunk-j8mw0za6.js.map +35 -0
- package/dist/cli/{chunk-ct47dqpx.js → chunk-jts8mvcz.js} +67 -7
- package/dist/cli/{chunk-2mzebbbz.js.map → chunk-jts8mvcz.js.map} +6 -4
- package/dist/cli/{chunk-ps4m1xh4.js → chunk-mnqj32sj.js} +505 -542
- package/dist/cli/chunk-mnqj32sj.js.map +12 -0
- package/dist/cli/{chunk-8cjtbafj.js → chunk-mwt1k8n7.js} +100 -374
- package/dist/cli/chunk-mwt1k8n7.js.map +10 -0
- package/dist/cli/chunk-nk3ts2xk.js +51 -0
- package/dist/cli/chunk-nk3ts2xk.js.map +10 -0
- package/dist/cli/{chunk-3r45185y.js → chunk-pat2zzwc.js} +9 -11
- package/dist/cli/{chunk-3r45185y.js.map → chunk-pat2zzwc.js.map} +2 -2
- package/dist/cli/chunk-pnnvybbk.js +176 -0
- package/dist/cli/chunk-pnnvybbk.js.map +11 -0
- package/dist/cli/{chunk-4x36ddpw.js → chunk-sqn5t4q0.js} +81 -87
- package/dist/cli/chunk-sqn5t4q0.js.map +10 -0
- package/dist/cli/{chunk-bvwwhd84.js → chunk-tzne8qfq.js} +15 -15
- package/dist/cli/{chunk-bvwwhd84.js.map → chunk-tzne8qfq.js.map} +1 -1
- package/dist/cli/chunk-xaz13gwg.js +12449 -0
- package/dist/cli/chunk-xaz13gwg.js.map +182 -0
- package/dist/cli/chunk-y3e45rc8.js +102 -0
- package/dist/cli/chunk-y3e45rc8.js.map +10 -0
- package/dist/cli/chunk-z01ze5c1.js +261 -0
- package/dist/cli/chunk-z01ze5c1.js.map +10 -0
- package/dist/cli/{chunk-k79xp7av.js → chunk-z1f5arsg.js} +219 -689
- package/dist/cli/chunk-z1f5arsg.js.map +36 -0
- package/dist/cli/{chunk-1jefwnfs.js → chunk-zg2gtj10.js} +1076 -2592
- package/dist/cli/chunk-zg2gtj10.js.map +35 -0
- package/dist/cli/{chunk-dwgcp5sm.js → chunk-zxccj738.js} +1 -1
- package/dist/cli/index.js +214 -57
- package/dist/cli/index.js.map +8 -7
- package/dist/types/ai/agent-readability.d.ts +52 -0
- package/dist/types/ai/ai-catalog.d.ts +42 -0
- package/dist/types/ai/api/paths.d.ts +17 -0
- package/dist/types/ai/api-catalog.d.ts +18 -0
- package/dist/types/ai/ask.d.ts +368 -0
- package/dist/types/ai/changelog-markdown.d.ts +2 -0
- package/dist/types/ai/component-markdown.d.ts +2 -2
- package/dist/types/ai/index.d.ts +24 -0
- package/dist/types/ai/link-headers.d.ts +24 -0
- package/dist/types/ai/llms.d.ts +25 -0
- package/dist/types/ai/markdown.d.ts +45 -0
- package/dist/types/ai/mcp/discovery.d.ts +68 -0
- package/dist/types/ai/mcp/tools.d.ts +16 -0
- package/dist/types/ai/openapi-components.d.ts +43 -0
- package/dist/types/ai/relative-links.d.ts +26 -0
- package/dist/types/ai/serializers.d.ts +15 -0
- package/dist/types/ai/skills.d.ts +42 -0
- package/dist/types/ai/tar.d.ts +25 -0
- package/dist/types/ai/visibility.d.ts +17 -0
- package/dist/types/ai/web-bot-auth.d.ts +16 -0
- package/dist/types/analytics/adobe.d.ts +35 -0
- package/dist/types/analytics/amplitude.d.ts +50 -0
- package/dist/types/analytics/clarity.d.ts +31 -0
- package/dist/types/analytics/clearbit.d.ts +29 -0
- package/dist/types/analytics/cloudflare.d.ts +41 -0
- package/dist/types/analytics/fathom.d.ts +41 -0
- package/dist/types/analytics/google-analytics.d.ts +44 -0
- package/dist/types/analytics/google-tag-manager.d.ts +40 -0
- package/dist/types/analytics/head.d.ts +30 -0
- package/dist/types/analytics/heap.d.ts +40 -0
- package/dist/types/analytics/hightouch.d.ts +44 -0
- package/dist/types/analytics/hotjar.d.ts +33 -0
- package/dist/types/analytics/index.d.ts +61 -0
- package/dist/types/analytics/inline.d.ts +17 -0
- package/dist/types/analytics/logrocket.d.ts +44 -0
- package/dist/types/analytics/mixpanel.d.ts +67 -0
- package/dist/types/analytics/pirsch.d.ts +42 -0
- package/dist/types/analytics/plausible.d.ts +56 -0
- package/dist/types/analytics/posthog.d.ts +45 -0
- package/dist/types/analytics/schema.d.ts +320 -0
- package/dist/types/analytics/script.d.ts +46 -0
- package/dist/types/analytics/segment.d.ts +50 -0
- package/dist/types/analytics/vercel.d.ts +48 -0
- package/dist/types/astro/integration.d.ts +76 -0
- package/dist/types/astro/markdown-negotiation.d.ts +23 -0
- package/dist/types/astro/module-types.d.ts +14 -0
- package/dist/types/astro/pages.d.ts +44 -0
- package/dist/types/cli/env.d.ts +12 -0
- package/dist/types/cli/init/scaffold.d.ts +154 -0
- package/dist/types/components/layout/nav-utils.d.ts +11 -0
- package/dist/types/core/adapter.d.ts +47 -0
- package/dist/types/core/api-name.d.ts +7 -0
- package/dist/types/core/changelog-index.d.ts +13 -0
- package/dist/types/core/config-input.d.ts +186 -515
- package/dist/types/core/config.d.ts +60 -34
- package/dist/types/core/content-assets.d.ts +76 -0
- package/dist/types/core/custom-pages.d.ts +33 -0
- package/dist/types/core/data.d.ts +27 -12
- package/dist/types/core/define-components.d.ts +12 -9
- package/dist/types/core/deployment-env.d.ts +6 -11
- package/dist/types/core/frontmatter.d.ts +10 -0
- package/dist/types/core/graph.d.ts +18 -0
- package/dist/types/core/heading-markers.d.ts +54 -0
- package/dist/types/core/i18n-ui.d.ts +6 -2
- package/dist/types/core/i18n.d.ts +87 -0
- package/dist/types/core/includes.d.ts +138 -0
- package/dist/types/core/last-modified.d.ts +47 -0
- package/dist/types/core/links.d.ts +95 -0
- package/dist/types/core/locale-links.d.ts +60 -0
- package/dist/types/core/manifest.d.ts +17 -0
- package/dist/types/core/meta.d.ts +38 -0
- package/dist/types/core/nav-diagnostics.d.ts +26 -0
- package/dist/types/core/navigation.d.ts +6 -0
- package/dist/types/core/node-require.d.ts +19 -0
- package/dist/types/core/package-json.d.ts +13 -0
- package/dist/types/core/probe.d.ts +42 -0
- package/dist/types/core/project-graph.d.ts +51 -0
- package/dist/types/core/project.d.ts +2 -0
- package/dist/types/core/safe-href.d.ts +2 -0
- package/dist/types/core/safe-links.d.ts +26 -0
- package/dist/types/core/schema.d.ts +2282 -452
- package/dist/types/core/site-url.d.ts +16 -0
- package/dist/types/core/sources/assets.d.ts +36 -0
- package/dist/types/core/sources/cache.d.ts +37 -0
- package/dist/types/core/sources/collection.d.ts +28 -0
- package/dist/types/core/sources/contentful-rich-text.d.ts +31 -0
- package/dist/types/core/sources/contentful.d.ts +40 -0
- package/dist/types/core/sources/filesystem.d.ts +24 -0
- package/dist/types/core/sources/github-releases.d.ts +31 -0
- package/dist/types/core/sources/json.d.ts +30 -0
- package/dist/types/core/sources/lexical.d.ts +19 -0
- package/dist/types/core/sources/lower.d.ts +75 -0
- package/dist/types/core/sources/mdx-remote.d.ts +28 -0
- package/dist/types/core/sources/normalize.d.ts +147 -0
- package/dist/types/core/sources/notion.d.ts +131 -0
- package/dist/types/core/sources/obsidian.d.ts +46 -0
- package/dist/types/core/sources/payload.d.ts +39 -0
- package/dist/types/core/sources/portable-text.d.ts +42 -0
- package/dist/types/core/sources/read.d.ts +23 -0
- package/dist/types/core/sources/remote.d.ts +74 -0
- package/dist/types/core/sources/resolve.d.ts +19 -0
- package/dist/types/core/sources/sanity.d.ts +43 -0
- package/dist/types/core/sources/strapi-blocks.d.ts +12 -0
- package/dist/types/core/sources/strapi.d.ts +33 -0
- package/dist/types/core/sources/types.d.ts +7 -0
- package/dist/types/core/sources/watch.d.ts +45 -0
- package/dist/types/core/text-width.d.ts +11 -0
- package/dist/types/core/types.d.ts +15 -1
- package/dist/types/core/unrecognized-keys.d.ts +7 -0
- package/dist/types/core/versions.d.ts +72 -0
- package/dist/types/core/yaml.d.ts +9 -0
- package/dist/types/deploy/adapter-output.d.ts +45 -0
- package/dist/types/deploy/adapters/cloudflare.d.ts +40 -0
- package/dist/types/deploy/adapters/index.d.ts +29 -0
- package/dist/types/deploy/adapters/netlify.d.ts +37 -0
- package/dist/types/deploy/adapters/node.d.ts +37 -0
- package/dist/types/deploy/adapters/registry.d.ts +133 -0
- package/dist/types/deploy/adapters/types.d.ts +71 -0
- package/dist/types/deploy/adapters/vercel.d.ts +38 -0
- package/dist/types/deploy/artifacts.d.ts +65 -0
- package/dist/types/deploy/cloudflare-negotiation.d.ts +196 -0
- package/dist/types/deploy/function-bundle.d.ts +80 -0
- package/dist/types/deploy/headers.d.ts +50 -0
- package/dist/types/deploy/node-headers.d.ts +42 -0
- package/dist/types/deploy/platforms/cloudflare.d.ts +40 -0
- package/dist/types/deploy/platforms/index.d.ts +18 -0
- package/dist/types/deploy/platforms/netlify.d.ts +13 -0
- package/dist/types/deploy/platforms/node.d.ts +11 -0
- package/dist/types/deploy/platforms/paths.d.ts +27 -0
- package/dist/types/deploy/platforms/static.d.ts +10 -0
- package/dist/types/deploy/platforms/types.d.ts +104 -0
- package/dist/types/deploy/platforms/vercel.d.ts +32 -0
- package/dist/types/deploy/redirects.d.ts +53 -0
- package/dist/types/deploy/robots.d.ts +8 -0
- package/dist/types/deploy/rss.d.ts +31 -0
- package/dist/types/deploy/sitemap.d.ts +21 -0
- package/dist/types/deploy/vercel-negotiation.d.ts +109 -0
- package/dist/types/markdown/code-title.d.ts +32 -0
- package/dist/types/markdown/fence-meta.d.ts +23 -0
- package/dist/types/markdown/themes.d.ts +3 -3
- package/dist/types/openapi/asyncapi.d.ts +129 -0
- package/dist/types/openapi/graphql-build.d.ts +8 -0
- package/dist/types/openapi/graphql.d.ts +122 -0
- package/dist/types/openapi/model.d.ts +158 -0
- package/dist/types/openapi/parse.d.ts +57 -0
- package/dist/types/openapi/references.d.ts +37 -25
- package/dist/types/openapi/render-mdx.d.ts +33 -0
- package/dist/types/openapi/sentence.d.ts +7 -0
- package/dist/types/openapi/signature.d.ts +10 -0
- package/dist/types/openapi/source.d.ts +22 -0
- package/dist/types/openapi/spec-dependency-error.d.ts +10 -0
- package/dist/types/reference/asyncapi.d.ts +166 -0
- package/dist/types/reference/graphql.d.ts +181 -0
- package/dist/types/reference/index.d.ts +32 -0
- package/dist/types/reference/openapi.d.ts +165 -0
- package/dist/types/reference/options.d.ts +157 -0
- package/dist/types/reference/scalar.d.ts +136 -0
- package/dist/types/reference/schema.d.ts +630 -0
- package/dist/types/search/adapters/algolia.d.ts +32 -0
- package/dist/types/search/adapters/flexsearch.d.ts +12 -0
- package/dist/types/search/adapters/index.d.ts +31 -0
- package/dist/types/search/adapters/mixedbread.d.ts +22 -0
- package/dist/types/search/adapters/orama-cloud.d.ts +33 -0
- package/dist/types/search/adapters/orama.d.ts +13 -0
- package/dist/types/search/adapters/pagefind.d.ts +12 -0
- package/dist/types/search/adapters/registry.d.ts +228 -0
- package/dist/types/search/adapters/types.d.ts +34 -0
- package/dist/types/search/adapters/typesense.d.ts +42 -0
- package/dist/types/search/build.d.ts +23 -0
- package/dist/types/search/documents.d.ts +90 -0
- package/dist/types/search/facets.d.ts +3 -0
- package/dist/types/search/sync/algolia.d.ts +14 -0
- package/dist/types/search/sync/index.d.ts +14 -0
- package/dist/types/search/sync/orama-cloud.d.ts +10 -0
- package/dist/types/search/sync/typesense.d.ts +14 -0
- package/dist/types/sources/contentful.d.ts +68 -0
- package/dist/types/sources/custom.d.ts +20 -0
- package/dist/types/sources/filesystem.d.ts +42 -0
- package/dist/types/sources/github-releases.d.ts +46 -0
- package/dist/types/sources/index.d.ts +48 -0
- package/dist/types/sources/mdx-remote.d.ts +63 -0
- package/dist/types/sources/notion.d.ts +65 -0
- package/dist/types/sources/obsidian.d.ts +34 -0
- package/dist/types/sources/payload.d.ts +68 -0
- package/dist/types/sources/registry.d.ts +1414 -0
- package/dist/types/sources/sanity.d.ts +69 -0
- package/dist/types/sources/shared.d.ts +46 -0
- package/dist/types/sources/strapi.d.ts +66 -0
- package/dist/types/theme/icon-kind.d.ts +11 -0
- package/dist/types/theme/icons.d.ts +20 -0
- package/docs/01-quickstart.mdx +18 -18
- package/docs/02-deployment.mdx +50 -26
- package/docs/03-upgrading.mdx +351 -0
- package/docs/04-migrating.mdx +58 -0
- package/docs/08-faq.mdx +3 -3
- package/docs/advanced/blog.mdx +13 -6
- package/docs/advanced/changelog.mdx +23 -35
- package/docs/advanced/custom-pages.mdx +20 -8
- package/docs/advanced/meta.ts +1 -8
- package/docs/advanced/skills.mdx +8 -0
- package/docs/cli/audit.mdx +646 -0
- package/docs/cli/doctor.mdx +29 -0
- package/docs/{reference/eval.mdx → cli/evals.mdx} +9 -8
- package/docs/cli/index.mdx +105 -0
- package/docs/cli/meta.ts +7 -0
- package/docs/{reference → cli}/translate.mdx +1 -1
- package/docs/cli/validate.mdx +41 -0
- package/docs/cli/version.mdx +40 -0
- package/docs/configuration/analytics.mdx +350 -59
- package/docs/configuration/ask-ai.mdx +162 -61
- package/docs/configuration/customization.mdx +15 -9
- package/docs/configuration/index.mdx +50 -31
- package/docs/configuration/search.mdx +75 -54
- package/docs/configuration/theming.mdx +24 -15
- package/docs/content/components.mdx +21 -5
- package/docs/{reference → content}/frontmatter.mdx +35 -1
- package/docs/content/i18n.mdx +8 -6
- package/docs/content/includes.mdx +2 -4
- package/docs/content/index.mdx +1 -1
- package/docs/content/islands.mdx +10 -5
- package/docs/content/meta.mdx +1 -1
- package/docs/content/meta.ts +1 -0
- package/docs/content/navigation.mdx +9 -7
- package/docs/content/sources.mdx +145 -50
- package/docs/content/syntax.mdx +16 -12
- package/docs/content/versioning.mdx +3 -3
- package/docs/discoverability/agent-discovery.mdx +11 -11
- package/docs/discoverability/index.mdx +4 -4
- package/docs/discoverability/json-api.mdx +4 -4
- package/docs/discoverability/llms-txt.mdx +6 -6
- package/docs/discoverability/markdown.mdx +4 -4
- package/docs/discoverability/mcp.mdx +11 -11
- package/docs/discoverability/sitemap-and-robots.mdx +3 -3
- package/docs/index.mdx +2 -2
- package/docs/references/asyncapi.mdx +59 -0
- package/docs/{advanced → references}/graphql.mdx +45 -32
- package/docs/{reference → references}/meta.ts +2 -2
- package/docs/references/openapi.mdx +171 -0
- package/docs/references/scalar.mdx +64 -0
- package/package.json +42 -8
- package/skills/blume/SKILL.md +21 -8
- package/skills/blume-migrate/SKILL.md +22 -21
- package/skills/blume-migrate/assets/oxfmt@0.67.0.patch +49 -0
- package/skills/blume-migrate/references/docusaurus.md +5 -4
- package/skills/blume-migrate/references/fumadocs.md +4 -4
- package/skills/blume-migrate/references/mintlify.md +23 -8
- package/skills/blume-migrate/references/monorepo.md +6 -6
- package/skills/blume-migrate/references/starlight.md +4 -4
- package/src/ai/agent-readability.ts +21 -22
- package/src/ai/ai-catalog.ts +50 -32
- package/src/ai/api/handlers.ts +46 -11
- package/src/ai/api-catalog.ts +8 -8
- package/src/ai/ask-data.ts +1 -1
- package/src/ai/ask.ts +624 -100
- package/src/ai/changelog-markdown.ts +91 -0
- package/src/ai/component-markdown.ts +328 -12
- package/src/ai/index.ts +45 -0
- package/src/ai/link-headers.ts +7 -6
- package/src/ai/llms.ts +20 -15
- package/src/ai/markdown.ts +35 -5
- package/src/ai/mcp/data.ts +9 -5
- package/src/ai/openapi-components.ts +4 -1
- package/src/ai/relative-links.ts +170 -0
- package/src/ai/serializers.ts +2 -2
- package/src/ai/skills.ts +1 -1
- package/src/ai/web-bot-auth.ts +2 -2
- package/src/analytics/adobe.ts +46 -0
- package/src/analytics/amplitude.ts +79 -0
- package/src/analytics/clarity.ts +46 -0
- package/src/analytics/clearbit.ts +47 -0
- package/src/analytics/cloudflare.ts +67 -0
- package/src/analytics/fathom.ts +64 -0
- package/src/analytics/google-analytics.ts +84 -0
- package/src/analytics/google-tag-manager.ts +61 -0
- package/src/analytics/head.ts +130 -0
- package/src/analytics/heap.ts +65 -0
- package/src/analytics/hightouch.ts +77 -0
- package/src/analytics/hotjar.ts +47 -0
- package/src/analytics/index.ts +71 -0
- package/src/analytics/inline.ts +21 -0
- package/src/analytics/logrocket.ts +71 -0
- package/src/analytics/mixpanel.ts +92 -0
- package/src/analytics/pirsch.ts +66 -0
- package/src/analytics/plausible.ts +83 -0
- package/src/analytics/posthog.ts +78 -0
- package/src/analytics/schema.ts +60 -0
- package/src/analytics/script.ts +60 -0
- package/src/analytics/segment.ts +85 -0
- package/src/analytics/vercel.ts +50 -0
- package/src/astro/adapter-root.ts +7 -9
- package/src/astro/component-slots.ts +131 -91
- package/src/astro/generate.ts +112 -345
- package/src/astro/integration.ts +2 -6
- package/src/astro/pages.ts +13 -101
- package/src/astro/render-deps.ts +379 -0
- package/src/astro/runtime-deps.ts +201 -0
- package/src/astro/templates.ts +554 -541
- package/src/audit/agent.ts +24 -0
- package/src/audit/catalog.ts +2 -2
- package/src/audit/checks/assets.ts +2 -2
- package/src/audit/checks/dns-aid.ts +1 -1
- package/src/audit/checks/duplicates.ts +3 -1
- package/src/audit/checks/i18n.ts +1 -1
- package/src/audit/checks/indexability.ts +7 -7
- package/src/audit/checks/links.ts +2 -2
- package/src/audit/checks/llms.ts +6 -6
- package/src/audit/checks/network.ts +3 -3
- package/src/audit/checks/og-image.ts +2 -2
- package/src/audit/checks/robots.ts +1 -1
- package/src/audit/checks/sitemap.ts +2 -2
- package/src/audit/checks/social.ts +1 -1
- package/src/audit/run.ts +4 -3
- package/src/audit/terms.ts +31 -0
- package/src/audit/url.ts +13 -13
- package/src/cli/command-meta.ts +10 -0
- package/src/cli/commands/audit.ts +39 -20
- package/src/cli/commands/build.ts +71 -316
- package/src/cli/commands/check.ts +1 -0
- package/src/cli/commands/dev.ts +40 -1
- package/src/cli/commands/doctor.ts +90 -14
- package/src/cli/commands/eject.ts +44 -7
- package/src/cli/commands/eval.ts +2 -2
- package/src/cli/commands/init.ts +161 -41
- package/src/cli/commands/migrate.ts +121 -0
- package/src/cli/commands/preview.ts +7 -1
- package/src/cli/commands/translate.ts +2 -2
- package/src/cli/commands/upgrade.ts +141 -0
- package/src/cli/commands/version.ts +57 -44
- package/src/cli/eject-scripts.ts +121 -6
- package/src/cli/index.ts +11 -1
- package/src/cli/init/install.ts +70 -0
- package/src/cli/init/questions.ts +7 -0
- package/src/cli/init/scaffold.ts +459 -75
- package/src/cli/lazy-command.ts +37 -1
- package/src/cli/prepare.ts +40 -6
- package/src/cli/required-secrets.ts +38 -11
- package/src/cli/unknown-flags.ts +266 -0
- package/src/cli/yarn-pnp.ts +52 -0
- package/src/components/content/AccordionItem.astro +7 -1
- package/src/components/content/Card.astro +4 -3
- package/src/components/content/ColorItem.astro +22 -4
- package/src/components/content/GithubInfo.astro +2 -2
- package/src/components/content/Prompt.astro +25 -25
- package/src/components/content/Tabs.astro +3 -1
- package/src/components/content/Tile.astro +2 -3
- package/src/components/content/Tooltip.astro +57 -9
- package/src/components/content/content-strings.ts +34 -0
- package/src/components/content/diff.ts +1 -1
- package/src/components/content/mermaid-element.ts +13 -2
- package/src/components/content/prompt-markdown.ts +292 -0
- package/src/components/content/tooltip-id.ts +41 -0
- package/src/components/islands/hooks.ts +25 -2
- package/src/components/layout/Analytics.astro +21 -79
- package/src/components/layout/Banner.astro +3 -1
- package/src/components/layout/DiscoveryLinks.astro +69 -0
- package/src/components/layout/Header.astro +83 -20
- package/src/components/layout/LanguageSwitcher.astro +4 -1
- package/src/components/layout/Logo.astro +23 -2
- package/src/components/layout/NavSelector.astro +13 -2
- package/src/components/layout/NavTree.astro +12 -3
- package/src/components/layout/NavTreeScript.astro +17 -3
- package/src/components/layout/PageActions.astro +3 -3
- package/src/components/layout/PageFeedback.astro +11 -1
- package/src/components/layout/PageLayout.astro +52 -5
- package/src/components/layout/ReferenceLayout.astro +21 -12
- package/src/components/layout/RootLayout.astro +69 -66
- package/src/components/layout/Search.astro +30 -6
- package/src/components/layout/WebMcp.astro +1 -1
- package/src/components/layout/analytics-client.ts +72 -15
- package/src/components/layout/drawer-inert.ts +113 -15
- package/src/components/layout/dropdown-clamp.ts +105 -0
- package/src/components/layout/head-scripts.ts +15 -6
- package/src/components/layout/nav-utils.ts +17 -0
- package/src/components/layout/search/algolia.ts +8 -8
- package/src/components/layout/search/orama-cloud.ts +9 -7
- package/src/components/layout/search/typesense.ts +11 -17
- package/src/components/openapi/MessageComposer.astro +2 -2
- package/src/components/openapi/Playground.astro +2 -2
- package/src/components/openapi/playground-client.ts +79 -10
- package/src/core/changelog-index.ts +24 -0
- package/src/core/component-overrides.ts +399 -154
- package/src/core/config-input.ts +188 -553
- package/src/core/config.ts +130 -41
- package/src/core/custom-pages.ts +105 -0
- package/src/core/data.ts +31 -12
- package/src/core/define-components.ts +12 -9
- package/src/core/deployment-env.ts +18 -74
- package/src/core/diagnostics.ts +14 -7
- package/src/core/graph.ts +69 -25
- package/src/core/i18n-ui.ts +6 -2
- package/src/core/i18n.ts +17 -0
- package/src/core/includes.ts +156 -38
- package/src/core/last-modified.ts +6 -11
- package/src/core/links.ts +166 -2
- package/src/core/manifest.ts +10 -3
- package/src/core/navigation.ts +115 -16
- package/src/core/new-tab.ts +35 -0
- package/src/core/node-require.ts +21 -0
- package/src/core/project-graph.ts +42 -26
- package/src/core/project.ts +9 -4
- package/src/core/request-body.ts +61 -0
- package/src/core/safe-href.ts +28 -0
- package/src/core/safe-links.ts +68 -0
- package/src/core/schema.ts +517 -739
- package/src/core/server-features.ts +8 -9
- package/src/core/sources/assets.ts +47 -11
- package/src/core/sources/collection.ts +67 -0
- package/src/core/sources/contentful-rich-text.ts +285 -0
- package/src/core/sources/contentful.ts +173 -0
- package/src/core/sources/github-releases.ts +51 -1
- package/src/core/sources/json.ts +71 -0
- package/src/core/sources/lexical.ts +195 -0
- package/src/core/sources/lower.ts +226 -0
- package/src/core/sources/normalize.ts +52 -2
- package/src/core/sources/notion.ts +39 -28
- package/src/core/sources/payload.ts +135 -0
- package/src/core/sources/portable-text.ts +11 -16
- package/src/core/sources/remote.ts +226 -0
- package/src/core/sources/resolve.ts +104 -166
- package/src/core/sources/sanity.ts +16 -49
- package/src/core/sources/strapi-blocks.ts +124 -0
- package/src/core/sources/strapi.ts +191 -0
- package/src/core/sources/types.ts +12 -1
- package/src/core/types.ts +15 -1
- package/src/core/ui-packs/ar.ts +6 -2
- package/src/core/ui-packs/bg.ts +6 -2
- package/src/core/ui-packs/bn.ts +6 -2
- package/src/core/ui-packs/ca.ts +3 -1
- package/src/core/ui-packs/cs.ts +6 -2
- package/src/core/ui-packs/da.ts +6 -2
- package/src/core/ui-packs/de.ts +6 -2
- package/src/core/ui-packs/el.ts +3 -1
- package/src/core/ui-packs/es.ts +3 -1
- package/src/core/ui-packs/fa.ts +6 -2
- package/src/core/ui-packs/fi.ts +6 -2
- package/src/core/ui-packs/fr.ts +3 -1
- package/src/core/ui-packs/he.ts +6 -2
- package/src/core/ui-packs/hi.ts +6 -2
- package/src/core/ui-packs/hr.ts +6 -2
- package/src/core/ui-packs/hu.ts +6 -2
- package/src/core/ui-packs/id.ts +6 -2
- package/src/core/ui-packs/it.ts +3 -1
- package/src/core/ui-packs/ja.ts +3 -1
- package/src/core/ui-packs/ko.ts +3 -1
- package/src/core/ui-packs/nl.ts +6 -2
- package/src/core/ui-packs/no.ts +6 -2
- package/src/core/ui-packs/pl.ts +6 -2
- package/src/core/ui-packs/pt-br.ts +3 -1
- package/src/core/ui-packs/pt.ts +3 -1
- package/src/core/ui-packs/ro.ts +6 -2
- package/src/core/ui-packs/ru.ts +6 -2
- package/src/core/ui-packs/sk.ts +6 -2
- package/src/core/ui-packs/sr.ts +6 -2
- package/src/core/ui-packs/sv.ts +6 -2
- package/src/core/ui-packs/th.ts +3 -1
- package/src/core/ui-packs/tr.ts +6 -2
- package/src/core/ui-packs/uk.ts +6 -2
- package/src/core/ui-packs/vi.ts +3 -1
- package/src/core/ui-packs/zh-tw.ts +3 -1
- package/src/core/ui-packs/zh.ts +3 -1
- package/src/core/unrecognized-keys.ts +10 -0
- package/src/core/version-cut.ts +116 -8
- package/src/deploy/adapter-output.ts +57 -97
- package/src/deploy/adapters/cloudflare.ts +39 -0
- package/src/deploy/adapters/index.ts +41 -0
- package/src/deploy/adapters/netlify.ts +34 -0
- package/src/deploy/adapters/node.ts +34 -0
- package/src/deploy/adapters/registry.ts +127 -0
- package/src/deploy/adapters/types.ts +92 -0
- package/src/deploy/adapters/vercel.ts +35 -0
- package/src/deploy/artifacts.ts +55 -27
- package/src/deploy/cloudflare-negotiation.ts +179 -100
- package/src/deploy/function-bundle.ts +18 -3
- package/src/deploy/headers.ts +124 -23
- package/src/deploy/node-headers.ts +198 -0
- package/src/deploy/platforms/cloudflare.ts +312 -0
- package/src/deploy/platforms/index.ts +67 -0
- package/src/deploy/platforms/netlify.ts +52 -0
- package/src/deploy/platforms/node.ts +40 -0
- package/src/deploy/platforms/paths.ts +42 -0
- package/src/deploy/platforms/static.ts +29 -0
- package/src/deploy/platforms/types.ts +112 -0
- package/src/deploy/platforms/vercel.ts +193 -0
- package/src/deploy/redirects.ts +30 -18
- package/src/deploy/robots.ts +3 -3
- package/src/deploy/rss.ts +2 -2
- package/src/deploy/sitemap.ts +2 -2
- package/src/deploy/vercel-negotiation.ts +2 -2
- package/src/eval/agents.ts +32 -1
- package/src/eval/findings.ts +19 -11
- package/src/eval/report.ts +10 -2
- package/src/markdown/external-links.ts +65 -0
- package/src/markdown/include.ts +45 -27
- package/src/markdown/index.ts +34 -9
- package/src/markdown/inline-code.ts +12 -6
- package/src/markdown/relative-links.ts +324 -0
- package/src/markdown/themes.ts +3 -3
- package/src/migrate/migrate.ts +149 -0
- package/src/openapi/parse.ts +64 -16
- package/src/openapi/proxy.ts +62 -10
- package/src/openapi/references.ts +147 -147
- package/src/openapi/render-mdx.ts +32 -10
- package/src/openapi/scalar.ts +15 -13
- package/src/openapi/sentence.ts +14 -0
- package/src/openapi/source.ts +37 -21
- package/src/openapi/spec-dependency-error.ts +15 -0
- package/src/reference/asyncapi.ts +83 -0
- package/src/reference/graphql.ts +89 -0
- package/src/reference/index.ts +40 -0
- package/src/reference/openapi.ts +83 -0
- package/src/reference/options.ts +201 -0
- package/src/reference/scalar.ts +136 -0
- package/src/reference/schema.ts +88 -0
- package/src/registry/eject.ts +97 -42
- package/src/search/adapters/algolia.ts +46 -0
- package/src/search/adapters/flexsearch.ts +29 -0
- package/src/search/adapters/index.ts +39 -0
- package/src/search/adapters/mixedbread.ts +39 -0
- package/src/search/adapters/orama-cloud.ts +51 -0
- package/src/search/adapters/orama.ts +24 -0
- package/src/search/adapters/pagefind.ts +27 -0
- package/src/search/adapters/registry.ts +131 -0
- package/src/search/adapters/types.ts +46 -0
- package/src/search/adapters/typesense.ts +57 -0
- package/src/search/build.ts +8 -4
- package/src/search/documents.ts +6 -0
- package/src/search/sync/algolia.ts +12 -11
- package/src/search/sync/index.ts +35 -20
- package/src/search/sync/orama-cloud.ts +12 -9
- package/src/search/sync/typesense.ts +15 -13
- package/src/sources/contentful.ts +63 -0
- package/src/sources/custom.ts +38 -0
- package/src/sources/filesystem.ts +51 -0
- package/src/sources/github-releases.ts +52 -0
- package/src/sources/index.ts +60 -0
- package/src/sources/mdx-remote.ts +76 -0
- package/src/sources/notion.ts +63 -0
- package/src/sources/obsidian.ts +38 -0
- package/src/sources/payload.ts +60 -0
- package/src/sources/registry.ts +182 -0
- package/src/sources/sanity.ts +66 -0
- package/src/sources/shared.ts +52 -0
- package/src/sources/strapi.ts +58 -0
- package/src/theme/entry.ts +24 -2
- package/src/translate/report.ts +40 -7
- package/src/upgrade/upgrade.ts +499 -0
- package/dist/cli/chunk-0qymqwzz.js +0 -164
- package/dist/cli/chunk-0qymqwzz.js.map +0 -15
- package/dist/cli/chunk-1jefwnfs.js.map +0 -48
- package/dist/cli/chunk-2mzebbbz.js +0 -69
- package/dist/cli/chunk-2z47ypj8.js.map +0 -11
- package/dist/cli/chunk-4x36ddpw.js.map +0 -11
- package/dist/cli/chunk-5093q3n7.js +0 -68
- package/dist/cli/chunk-5093q3n7.js.map +0 -10
- package/dist/cli/chunk-5qk08vmp.js.map +0 -11
- package/dist/cli/chunk-7s8hm3b6.js +0 -5347
- package/dist/cli/chunk-7s8hm3b6.js.map +0 -58
- package/dist/cli/chunk-8cjtbafj.js.map +0 -13
- package/dist/cli/chunk-97r59kpr.js +0 -381
- package/dist/cli/chunk-97r59kpr.js.map +0 -12
- package/dist/cli/chunk-ahnw3kxw.js.map +0 -15
- package/dist/cli/chunk-b27xqwn9.js.map +0 -10
- package/dist/cli/chunk-bf6bt1xt.js +0 -185
- package/dist/cli/chunk-bf6bt1xt.js.map +0 -11
- package/dist/cli/chunk-cjtn640a.js.map +0 -10
- package/dist/cli/chunk-ct47dqpx.js.map +0 -11
- package/dist/cli/chunk-esphfr8p.js +0 -107
- package/dist/cli/chunk-esphfr8p.js.map +0 -11
- package/dist/cli/chunk-ex56aa81.js +0 -1016
- package/dist/cli/chunk-ex56aa81.js.map +0 -13
- package/dist/cli/chunk-garjf5z9.js +0 -30
- package/dist/cli/chunk-garjf5z9.js.map +0 -10
- package/dist/cli/chunk-js7saxwm.js +0 -1045
- package/dist/cli/chunk-js7saxwm.js.map +0 -22
- package/dist/cli/chunk-k79xp7av.js.map +0 -39
- package/dist/cli/chunk-ps4m1xh4.js.map +0 -15
- package/dist/cli/chunk-q4rae3bg.js +0 -60
- package/dist/cli/chunk-q4rae3bg.js.map +0 -10
- package/dist/cli/chunk-rz9jmfhz.js +0 -108
- package/dist/cli/chunk-rz9jmfhz.js.map +0 -10
- package/dist/cli/chunk-vh9w1sgp.js +0 -73
- package/dist/cli/chunk-vh9w1sgp.js.map +0 -10
- package/dist/cli/chunk-vrfp10qk.js +0 -81
- package/dist/cli/chunk-vrfp10qk.js.map +0 -10
- package/dist/cli/chunk-yg63d42r.js.map +0 -34
- package/docs/advanced/api-reference.mdx +0 -240
- package/docs/reference/cli.mdx +0 -197
- package/skills/blume-migrate/assets/oxfmt@0.55.0.patch +0 -20
- package/src/components/content/changelog-element.ts +0 -69
- package/src/search/providers.ts +0 -91
- /package/dist/cli/{chunk-e7f42gdj.js.map → chunk-7ez8ny0t.js.map} +0 -0
- /package/dist/cli/{chunk-nn13znc2.js.map → chunk-88cpgt6h.js.map} +0 -0
- /package/dist/cli/{chunk-vacwm2hv.js.map → chunk-f7t03s3g.js.map} +0 -0
- /package/dist/cli/{chunk-dwgcp5sm.js.map → chunk-zxccj738.js.map} +0 -0
|
@@ -28,7 +28,7 @@ import { runTranslate } from "../../translate/run.ts";
|
|
|
28
28
|
import { computeWorkList } from "../../translate/work-list.ts";
|
|
29
29
|
import { commandMeta } from "../command-meta.ts";
|
|
30
30
|
import { reportInternalError } from "../internal-error.ts";
|
|
31
|
-
import { flushStdout, logger } from "../log.ts";
|
|
31
|
+
import { flushStdout, logger, reportDiagnostics } from "../log.ts";
|
|
32
32
|
|
|
33
33
|
/** Wall-clock ceiling per file, in seconds. */
|
|
34
34
|
const DEFAULT_TIMEOUT_S = DEFAULT_TRANSLATE_TIMEOUT_MS / 1000;
|
|
@@ -293,7 +293,7 @@ export const translateCommand = defineCommand({
|
|
|
293
293
|
}
|
|
294
294
|
} catch (error) {
|
|
295
295
|
if (error instanceof BlumeError) {
|
|
296
|
-
|
|
296
|
+
reportDiagnostics([error.diagnostic], root);
|
|
297
297
|
process.exit(1);
|
|
298
298
|
}
|
|
299
299
|
// SAFETY: an ENOENT from spawning the agent CLI is an ErrnoException;
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { defineCommand } from "citty";
|
|
2
|
+
import { join } from "pathe";
|
|
3
|
+
|
|
4
|
+
import { AGENTS, launchInstalledAgent } from "../../audit/agent.ts";
|
|
5
|
+
import type { AgentKind } from "../../audit/agent.ts";
|
|
6
|
+
import { formatDiagnostic } from "../../core/diagnostics.ts";
|
|
7
|
+
import { packageRoot } from "../../core/package-root.ts";
|
|
8
|
+
import { getBlumeVersion } from "../../core/version.ts";
|
|
9
|
+
import {
|
|
10
|
+
UPGRADE_GUIDE_FILE,
|
|
11
|
+
UPGRADE_GUIDE_URL,
|
|
12
|
+
bumpBlumeDependency,
|
|
13
|
+
collectUpgradeFindings,
|
|
14
|
+
isOutsideBlumeProject,
|
|
15
|
+
upgradePrompt,
|
|
16
|
+
} from "../../upgrade/upgrade.ts";
|
|
17
|
+
import { commandMeta } from "../command-meta.ts";
|
|
18
|
+
import { installDependencies } from "../init/install.ts";
|
|
19
|
+
import { commandsFor, detectProjectPackageManager } from "../init/scaffold.ts";
|
|
20
|
+
import { reportInternalError } from "../internal-error.ts";
|
|
21
|
+
import { logger } from "../log.ts";
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* `blume upgrade` — move a project to this version of Blume. Run it through the
|
|
25
|
+
* package runner (`npx blume@latest upgrade`), since a project on the previous
|
|
26
|
+
* major doesn't have the command yet: it bumps `blume` in `package.json`,
|
|
27
|
+
* installs, then checks the config, `components.ts`, and each page's front
|
|
28
|
+
* matter against this version and lists what's left, or hands the list to
|
|
29
|
+
* Claude Code or Codex the way
|
|
30
|
+
* `blume audit --claude` does. Status lines go straight to stderr, like the
|
|
31
|
+
* audit's: consola drops info-level lines in test and CI environments.
|
|
32
|
+
*/
|
|
33
|
+
export const upgradeCommand = defineCommand({
|
|
34
|
+
args: {
|
|
35
|
+
claude: {
|
|
36
|
+
description: "Hand the remaining changes to Claude Code.",
|
|
37
|
+
type: "boolean",
|
|
38
|
+
},
|
|
39
|
+
codex: {
|
|
40
|
+
description: "Hand the remaining changes to Codex.",
|
|
41
|
+
type: "boolean",
|
|
42
|
+
},
|
|
43
|
+
install: {
|
|
44
|
+
default: true,
|
|
45
|
+
description: "Install dependencies after bumping blume.",
|
|
46
|
+
negativeDescription: "Bump package.json without installing.",
|
|
47
|
+
type: "boolean",
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
meta: commandMeta.upgrade,
|
|
51
|
+
async run({ args }) {
|
|
52
|
+
const root = process.cwd();
|
|
53
|
+
// SAFETY: AGENTS is a closed record keyed by AgentKind, so its keys are
|
|
54
|
+
// exactly the agent kinds.
|
|
55
|
+
const agents = (Object.keys(AGENTS) as AgentKind[]).filter(
|
|
56
|
+
(kind) => args[kind]
|
|
57
|
+
);
|
|
58
|
+
if (agents.length > 1) {
|
|
59
|
+
logger.error("Pass at most one of --claude or --codex.");
|
|
60
|
+
process.exit(1);
|
|
61
|
+
}
|
|
62
|
+
const [agent] = agents;
|
|
63
|
+
const version = getBlumeVersion();
|
|
64
|
+
|
|
65
|
+
try {
|
|
66
|
+
const bump = await bumpBlumeDependency(root, version);
|
|
67
|
+
// With neither a config nor a `blume` dependency there is nothing to
|
|
68
|
+
// check: the defaults would always pass and report the folder ready.
|
|
69
|
+
if (isOutsideBlumeProject(root, bump)) {
|
|
70
|
+
logger.error(
|
|
71
|
+
"No blume.config.ts or `blume` dependency here. Run `blume upgrade` from the folder with blume.config.ts — in a monorepo, the package that depends on blume."
|
|
72
|
+
);
|
|
73
|
+
process.exit(1);
|
|
74
|
+
}
|
|
75
|
+
const pm = await detectProjectPackageManager(root);
|
|
76
|
+
// A local install puts no `blume` on PATH, so every command this
|
|
77
|
+
// prints (or hands the agent) runs through the project's runner.
|
|
78
|
+
const runner = commandsFor(pm).exec;
|
|
79
|
+
if (bump.status === "bumped") {
|
|
80
|
+
process.stderr.write(
|
|
81
|
+
` Bumped blume ${bump.from} → ${bump.to} in package.json.\n`
|
|
82
|
+
);
|
|
83
|
+
if (args.install) {
|
|
84
|
+
const outcome = await installDependencies(root, pm, {
|
|
85
|
+
quiet: false,
|
|
86
|
+
});
|
|
87
|
+
if (outcome.failure) {
|
|
88
|
+
logger.warn(
|
|
89
|
+
`Installing failed; run \`${outcome.command}\` yourself.\n${outcome.failure}`
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
} else if (bump.status === "missing") {
|
|
94
|
+
logger.warn(
|
|
95
|
+
`No \`blume\` dependency in ./package.json; add blume@^${version} to the package that uses it.`
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const findings = await collectUpgradeFindings(root);
|
|
100
|
+
if (findings.length === 0) {
|
|
101
|
+
process.stderr.write(
|
|
102
|
+
` Ready for Blume ${version}: the config, components.ts, and pages check out. Run \`${runner} blume build\` to confirm.\n`
|
|
103
|
+
);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
process.stderr.write(
|
|
107
|
+
`\n${findings.map((finding) => formatDiagnostic(finding, root)).join("\n\n")}\n\n`
|
|
108
|
+
);
|
|
109
|
+
|
|
110
|
+
if (!agent) {
|
|
111
|
+
process.stderr.write(
|
|
112
|
+
` Each change is covered in the upgrade guide: ${UPGRADE_GUIDE_URL}\n Rerun with --claude or --codex to hand them to a coding agent.\n`
|
|
113
|
+
);
|
|
114
|
+
process.exit(1);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const cli = AGENTS[agent];
|
|
118
|
+
process.stderr.write(` Handing the upgrade to ${cli.name}…\n\n`);
|
|
119
|
+
const prompt = upgradePrompt({
|
|
120
|
+
findings,
|
|
121
|
+
guidePath: join(packageRoot(), UPGRADE_GUIDE_FILE),
|
|
122
|
+
root,
|
|
123
|
+
runner,
|
|
124
|
+
version,
|
|
125
|
+
});
|
|
126
|
+
const code = await launchInstalledAgent(cli.bin, prompt);
|
|
127
|
+
if (code === null) {
|
|
128
|
+
logger.error(
|
|
129
|
+
`${cli.name} (\`${cli.bin}\`) was not found on PATH. Install it with \`${cli.install}\`.`
|
|
130
|
+
);
|
|
131
|
+
process.exit(1);
|
|
132
|
+
}
|
|
133
|
+
if (code !== 0) {
|
|
134
|
+
process.exit(code);
|
|
135
|
+
}
|
|
136
|
+
} catch (error) {
|
|
137
|
+
reportInternalError(error);
|
|
138
|
+
process.exit(1);
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
});
|
|
@@ -3,9 +3,58 @@ import { defineCommand } from "citty";
|
|
|
3
3
|
import { loadConfig } from "../../core/config.ts";
|
|
4
4
|
import { BlumeError } from "../../core/diagnostics.ts";
|
|
5
5
|
import { CutError, cutVersion } from "../../core/version-cut.ts";
|
|
6
|
+
import type { CutResult } from "../../core/version-cut.ts";
|
|
6
7
|
import { commandMeta } from "../command-meta.ts";
|
|
7
8
|
import { reportInternalError } from "../internal-error.ts";
|
|
8
|
-
import { logger } from "../log.ts";
|
|
9
|
+
import { logger, reportDiagnostics } from "../log.ts";
|
|
10
|
+
|
|
11
|
+
/** `blume version` with no id: list the configured versions. */
|
|
12
|
+
const listVersions = async (root: string): Promise<void> => {
|
|
13
|
+
const { config } = await loadConfig(root);
|
|
14
|
+
if (!config.versions) {
|
|
15
|
+
logger.info(
|
|
16
|
+
"Versioning is not configured. Cut the first version with `blume version <id>` (e.g. `blume version v1.0`)."
|
|
17
|
+
);
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const { current, archived } = config.versions;
|
|
21
|
+
process.stdout.write(
|
|
22
|
+
` ${current.label} (current)${current.badge ? ` — ${current.badge}` : ""}\n`
|
|
23
|
+
);
|
|
24
|
+
for (const version of archived) {
|
|
25
|
+
process.stdout.write(` ${version.label ?? version.id} — ${version.id}/\n`);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
/** Report what a cut did, including how its id reached the config (or didn't). */
|
|
30
|
+
const reportCut = (id: string, result: CutResult): void => {
|
|
31
|
+
logger.success(`Snapshot ${result.dir} (${result.copied} file(s) copied)`);
|
|
32
|
+
const totalRewrites = result.rewritten.reduce(
|
|
33
|
+
(sum, entry) => sum + entry.count,
|
|
34
|
+
0
|
|
35
|
+
);
|
|
36
|
+
if (totalRewrites > 0) {
|
|
37
|
+
logger.info(
|
|
38
|
+
`Rewrote root-absolute links in ${result.rewritten.length} page(s) (${totalRewrites} line(s)).`
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
if (result.versionsAdded) {
|
|
42
|
+
logger.success(
|
|
43
|
+
`Turned on versioning in blume.config.ts with "${id}" archived; the live docs are labeled "Latest" in the switcher until you rename versions.current.label.`
|
|
44
|
+
);
|
|
45
|
+
} else if (result.configUpdated) {
|
|
46
|
+
logger.success(`Added "${id}" to versions.archived in blume.config.ts`);
|
|
47
|
+
} else if (result.configSnippet) {
|
|
48
|
+
// A warning, not info: until it's pasted, the snapshot builds as ordinary
|
|
49
|
+
// content — every page twice — and consola drops info lines under CI.
|
|
50
|
+
logger.warn(
|
|
51
|
+
`blume.config.ts couldn't be updated automatically, so "${id}" isn't registered yet and its pages build as ordinary content until it is. ${result.configSnippet}`
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
logger.info(
|
|
55
|
+
"Archived versions are frozen — future edits belong in the live tree. Restart `blume dev` to pick up the snapshot."
|
|
56
|
+
);
|
|
57
|
+
};
|
|
9
58
|
|
|
10
59
|
export const versionCommand = defineCommand({
|
|
11
60
|
args: {
|
|
@@ -22,58 +71,22 @@ export const versionCommand = defineCommand({
|
|
|
22
71
|
meta: commandMeta.version,
|
|
23
72
|
async run({ args }) {
|
|
24
73
|
const root = process.cwd();
|
|
25
|
-
|
|
26
|
-
if (!args.id) {
|
|
27
|
-
const { config } = await loadConfig(root);
|
|
28
|
-
if (!config.versions) {
|
|
29
|
-
logger.info(
|
|
30
|
-
"Versioning is not configured. Cut the first version with `blume version <id>` (e.g. `blume version v1.0`)."
|
|
31
|
-
);
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
const { current, archived } = config.versions;
|
|
35
|
-
process.stdout.write(
|
|
36
|
-
` ${current.label} (current)${current.badge ? ` — ${current.badge}` : ""}\n`
|
|
37
|
-
);
|
|
38
|
-
for (const version of archived) {
|
|
39
|
-
process.stdout.write(
|
|
40
|
-
` ${version.label ?? version.id} — ${version.id}/\n`
|
|
41
|
-
);
|
|
42
|
-
}
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
74
|
try {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
const totalRewrites = result.rewritten.reduce(
|
|
52
|
-
(sum, entry) => sum + entry.count,
|
|
53
|
-
0
|
|
54
|
-
);
|
|
55
|
-
if (totalRewrites > 0) {
|
|
56
|
-
logger.info(
|
|
57
|
-
`Rewrote root-absolute links in ${result.rewritten.length} page(s) (${totalRewrites} line(s)).`
|
|
58
|
-
);
|
|
59
|
-
}
|
|
60
|
-
if (result.configUpdated) {
|
|
61
|
-
logger.success(
|
|
62
|
-
`Added "${args.id}" to versions.archived in blume.config.ts`
|
|
75
|
+
if (args.id) {
|
|
76
|
+
reportCut(
|
|
77
|
+
args.id,
|
|
78
|
+
await cutVersion(root, args.id, { force: args.force })
|
|
63
79
|
);
|
|
64
|
-
} else
|
|
65
|
-
|
|
80
|
+
} else {
|
|
81
|
+
await listVersions(root);
|
|
66
82
|
}
|
|
67
|
-
logger.info(
|
|
68
|
-
"Archived versions are frozen — future edits belong in the live tree. Restart `blume dev` to pick up the snapshot."
|
|
69
|
-
);
|
|
70
83
|
} catch (error) {
|
|
71
84
|
if (error instanceof CutError) {
|
|
72
85
|
logger.error(error.message);
|
|
73
86
|
process.exit(1);
|
|
74
87
|
}
|
|
75
88
|
if (error instanceof BlumeError) {
|
|
76
|
-
|
|
89
|
+
reportDiagnostics([error.diagnostic], root);
|
|
77
90
|
process.exit(1);
|
|
78
91
|
}
|
|
79
92
|
reportInternalError(error);
|
package/src/cli/eject-scripts.ts
CHANGED
|
@@ -1,7 +1,13 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
1
2
|
import { readFile, writeFile } from "node:fs/promises";
|
|
2
3
|
|
|
3
4
|
import { join } from "pathe";
|
|
4
5
|
|
|
6
|
+
import { EJECTED_CONFIG_HEADER } from "../astro/templates.ts";
|
|
7
|
+
import { packageRoot } from "../core/package-root.ts";
|
|
8
|
+
import { commandsFor, detectProjectPackageManager } from "./init/scaffold.ts";
|
|
9
|
+
import { logger } from "./log.ts";
|
|
10
|
+
|
|
5
11
|
/** A JSON value, as `JSON.parse` of a manifest can return. */
|
|
6
12
|
type JsonValue =
|
|
7
13
|
| string
|
|
@@ -14,22 +20,72 @@ type JsonValue =
|
|
|
14
20
|
/** The slice of package.json the rewrite touches; the rest rides along. */
|
|
15
21
|
interface PackageManifest {
|
|
16
22
|
[key: string]: JsonValue | undefined;
|
|
23
|
+
dependencies?: Record<string, string>;
|
|
24
|
+
devDependencies?: Record<string, string>;
|
|
25
|
+
optionalDependencies?: Record<string, string>;
|
|
26
|
+
peerDependencies?: Record<string, string>;
|
|
17
27
|
scripts?: Record<string, string>;
|
|
18
28
|
}
|
|
19
29
|
|
|
30
|
+
/** Package name → the semver range to depend on it at. */
|
|
31
|
+
export interface DependencyRanges {
|
|
32
|
+
[name: string]: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
20
35
|
/**
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
* serving the ejected app. A missing or unreadable package.json is left alone.
|
|
36
|
+
* The version range Blume itself uses for each package it depends on or
|
|
37
|
+
* accepts as a peer, plus `blume` at the installed version — what an ejected
|
|
38
|
+
* app should pin so it keeps building against the same majors.
|
|
25
39
|
*/
|
|
26
|
-
export const
|
|
40
|
+
export const blumeDependencyRanges = (): DependencyRanges => {
|
|
41
|
+
// SAFETY: blume's own package.json, which declares its version and both
|
|
42
|
+
// dependency maps; nothing else is read.
|
|
43
|
+
const manifest = JSON.parse(
|
|
44
|
+
readFileSync(join(packageRoot(), "package.json"), "utf-8")
|
|
45
|
+
) as {
|
|
46
|
+
dependencies: Record<string, string>;
|
|
47
|
+
peerDependencies: Record<string, string>;
|
|
48
|
+
version: string;
|
|
49
|
+
};
|
|
50
|
+
return {
|
|
51
|
+
...manifest.peerDependencies,
|
|
52
|
+
...manifest.dependencies,
|
|
53
|
+
blume: `^${manifest.version}`,
|
|
54
|
+
};
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
/** Whether the manifest already lists `name` in any dependency field. */
|
|
58
|
+
const declares = (pkg: PackageManifest, name: string): boolean =>
|
|
59
|
+
[
|
|
60
|
+
pkg.dependencies,
|
|
61
|
+
pkg.devDependencies,
|
|
62
|
+
pkg.optionalDependencies,
|
|
63
|
+
pkg.peerDependencies,
|
|
64
|
+
].some((field) => field !== undefined && Object.hasOwn(field, name));
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Point the project's package.json at the ejected app. Its scripts run Astro
|
|
68
|
+
* directly: after an eject the Blume CLI no longer manages the runtime, so
|
|
69
|
+
* scaffolded scripts like `"dev": "blume dev"` would rebuild the removed
|
|
70
|
+
* `.blume` tree instead of serving the ejected app. And every package the
|
|
71
|
+
* ejected app imports by bare name (`dependencies`, from `eject()`) that the
|
|
72
|
+
* project doesn't list yet becomes a dependency at the range Blume itself
|
|
73
|
+
* uses (`ranges`).
|
|
74
|
+
*
|
|
75
|
+
* Returns the names it added, so the caller can ask for an install. A missing
|
|
76
|
+
* or unreadable package.json is left alone.
|
|
77
|
+
*/
|
|
78
|
+
export const updatePackageScripts = async (
|
|
79
|
+
root: string,
|
|
80
|
+
dependencies: string[] = [],
|
|
81
|
+
ranges: DependencyRanges = blumeDependencyRanges()
|
|
82
|
+
): Promise<string[]> => {
|
|
27
83
|
const pkgPath = join(root, "package.json");
|
|
28
84
|
let pkg: PackageManifest;
|
|
29
85
|
try {
|
|
30
86
|
pkg = JSON.parse(await readFile(pkgPath, "utf-8"));
|
|
31
87
|
} catch {
|
|
32
|
-
return;
|
|
88
|
+
return [];
|
|
33
89
|
}
|
|
34
90
|
const scripts = pkg.scripts ?? {};
|
|
35
91
|
pkg.scripts = {
|
|
@@ -38,5 +94,64 @@ export const updatePackageScripts = async (root: string): Promise<void> => {
|
|
|
38
94
|
dev: "astro dev",
|
|
39
95
|
preview: "astro preview",
|
|
40
96
|
};
|
|
97
|
+
const added = dependencies.filter((name) => !declares(pkg, name));
|
|
98
|
+
if (added.length > 0) {
|
|
99
|
+
// Sorted, the way package managers write the field.
|
|
100
|
+
pkg.dependencies = Object.fromEntries(
|
|
101
|
+
Object.entries({
|
|
102
|
+
...pkg.dependencies,
|
|
103
|
+
...Object.fromEntries(added.map((name) => [name, ranges[name] ?? "*"])),
|
|
104
|
+
}).toSorted(([a], [b]) => (a < b ? -1 : 1))
|
|
105
|
+
);
|
|
106
|
+
}
|
|
41
107
|
await writeFile(pkgPath, `${JSON.stringify(pkg, null, 2)}\n`, "utf-8");
|
|
108
|
+
return added;
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* The first line Blume 1's `blume eject` wrote into the ejected
|
|
113
|
+
* `astro.config.mjs` — the hidden runtime's own header, carried over. Blume 2's
|
|
114
|
+
* hidden runtime keeps it under `.blume/`, never at the project root, so a root
|
|
115
|
+
* config that opens with it is an app Blume 1 ejected.
|
|
116
|
+
*/
|
|
117
|
+
const BLUME_1_EJECTED_CONFIG_HEADER =
|
|
118
|
+
"// Generated by Blume. Do not edit; this file is recreated on each run.";
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Whether `root` holds an app `blume eject` already wrote: a root
|
|
122
|
+
* `astro.config.mjs` whose first line is eject's header, or the header Blume 1
|
|
123
|
+
* ejected with. The header is the only signal: a Blume project may keep its own
|
|
124
|
+
* `astro.config.mjs` and a codegen `src/generated/` folder beside its content,
|
|
125
|
+
* and neither makes it an ejected app.
|
|
126
|
+
*/
|
|
127
|
+
export const isEjectedProject = (root: string): boolean => {
|
|
128
|
+
const config = join(root, "astro.config.mjs");
|
|
129
|
+
if (!existsSync(config)) {
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
const source = readFileSync(config, "utf-8");
|
|
133
|
+
return (
|
|
134
|
+
source.startsWith(EJECTED_CONFIG_HEADER) ||
|
|
135
|
+
source.startsWith(BLUME_1_EJECTED_CONFIG_HEADER)
|
|
136
|
+
);
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Stop `blume dev`/`blume build` in an ejected app. Either would regenerate
|
|
141
|
+
* `.blume/` from `blume.config.ts` and run that hidden copy, ignoring every
|
|
142
|
+
* edit made to the app since eject, so point at the app's own script under
|
|
143
|
+
* the project's package manager instead.
|
|
144
|
+
*/
|
|
145
|
+
export const refuseIfEjected = async (
|
|
146
|
+
root: string,
|
|
147
|
+
script: "build" | "dev"
|
|
148
|
+
): Promise<void> => {
|
|
149
|
+
if (!isEjectedProject(root)) {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
const commands = commandsFor(await detectProjectPackageManager(root));
|
|
153
|
+
logger.error(
|
|
154
|
+
`This project was ejected to a standalone Astro app, so \`blume ${script}\` would run a regenerated copy of the site instead of it. Run \`${commands[script]}\` instead.`
|
|
155
|
+
);
|
|
156
|
+
process.exit(1);
|
|
42
157
|
};
|
package/src/cli/index.ts
CHANGED
|
@@ -16,7 +16,7 @@ import "./log.ts";
|
|
|
16
16
|
|
|
17
17
|
const main = defineCommand({
|
|
18
18
|
meta: {
|
|
19
|
-
description: "
|
|
19
|
+
description: "The open-source docs framework for humans and agents.",
|
|
20
20
|
name: "blume",
|
|
21
21
|
version: getBlumeVersion(),
|
|
22
22
|
},
|
|
@@ -71,6 +71,11 @@ const main = defineCommand({
|
|
|
71
71
|
() => import("./commands/mcp-stdio.ts"),
|
|
72
72
|
"mcpStdioCommand"
|
|
73
73
|
),
|
|
74
|
+
migrate: lazyCommand(
|
|
75
|
+
commandMeta.migrate,
|
|
76
|
+
() => import("./commands/migrate.ts"),
|
|
77
|
+
"migrateCommand"
|
|
78
|
+
),
|
|
74
79
|
preview: lazyCommand(
|
|
75
80
|
commandMeta.preview,
|
|
76
81
|
() => import("./commands/preview.ts"),
|
|
@@ -86,6 +91,11 @@ const main = defineCommand({
|
|
|
86
91
|
() => import("./commands/translate.ts"),
|
|
87
92
|
"translateCommand"
|
|
88
93
|
),
|
|
94
|
+
upgrade: lazyCommand(
|
|
95
|
+
commandMeta.upgrade,
|
|
96
|
+
() => import("./commands/upgrade.ts"),
|
|
97
|
+
"upgradeCommand"
|
|
98
|
+
),
|
|
89
99
|
validate: lazyCommand(
|
|
90
100
|
commandMeta.validate,
|
|
91
101
|
() => import("./commands/validate.ts"),
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { once } from "node:events";
|
|
3
|
+
|
|
4
|
+
import { commandsFor } from "./scaffold.ts";
|
|
5
|
+
import type { PackageManager } from "./scaffold.ts";
|
|
6
|
+
|
|
7
|
+
/** How `installDependencies` ended, plus the command to print on failure. */
|
|
8
|
+
export interface InstallOutcome {
|
|
9
|
+
/** The install command that ran (`bun install`, `npm install`, …). */
|
|
10
|
+
command: string;
|
|
11
|
+
/**
|
|
12
|
+
* Why the install failed: the package manager's exit code with whatever it
|
|
13
|
+
* printed, or the spawn error when the binary isn't on PATH. Absent on
|
|
14
|
+
* success.
|
|
15
|
+
*/
|
|
16
|
+
failure?: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface InstallOptions {
|
|
20
|
+
/**
|
|
21
|
+
* Capture the package manager's output instead of streaming it to the
|
|
22
|
+
* terminal. Interactive runs capture it behind a spinner and show it only
|
|
23
|
+
* on failure; non-interactive runs stream it as-is.
|
|
24
|
+
*/
|
|
25
|
+
quiet: boolean;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Run the package manager's install in a freshly scaffolded project so
|
|
30
|
+
* `blume dev` works as soon as `init` returns. Never throws: a missing binary
|
|
31
|
+
* or a non-zero exit resolves with a `failure`, so the caller can keep the
|
|
32
|
+
* scaffolded files and print the exact command to retry by hand.
|
|
33
|
+
*/
|
|
34
|
+
export const installDependencies = async (
|
|
35
|
+
root: string,
|
|
36
|
+
pm: PackageManager,
|
|
37
|
+
{ quiet }: InstallOptions
|
|
38
|
+
): Promise<InstallOutcome> => {
|
|
39
|
+
const command = commandsFor(pm).install;
|
|
40
|
+
const child = spawn(pm, ["install"], {
|
|
41
|
+
cwd: root,
|
|
42
|
+
env: process.env,
|
|
43
|
+
// npm, pnpm and yarn are `.cmd` shims on Windows, which Node only runs
|
|
44
|
+
// through a shell; bun is a real executable everywhere.
|
|
45
|
+
shell: process.platform === "win32",
|
|
46
|
+
stdio: quiet ? ["ignore", "pipe", "pipe"] : "inherit",
|
|
47
|
+
});
|
|
48
|
+
const chunks: Buffer[] = [];
|
|
49
|
+
child.stdout?.on("data", (chunk: Buffer) => chunks.push(chunk));
|
|
50
|
+
child.stderr?.on("data", (chunk: Buffer) => chunks.push(chunk));
|
|
51
|
+
try {
|
|
52
|
+
// `once` rejects when the child emits `error` (e.g. ENOENT) before `close`.
|
|
53
|
+
// SAFETY: `close` is emitted with `(code, signal)`, so the first element
|
|
54
|
+
// is the exit code, or null when a signal ended the process.
|
|
55
|
+
const [code] = (await once(child, "close")) as [number | null];
|
|
56
|
+
if (code === 0) {
|
|
57
|
+
return { command };
|
|
58
|
+
}
|
|
59
|
+
const output = Buffer.concat(chunks).toString("utf-8").trim();
|
|
60
|
+
return {
|
|
61
|
+
command,
|
|
62
|
+
failure: [`${command} exited with code ${code}`, output]
|
|
63
|
+
.filter(Boolean)
|
|
64
|
+
.join("\n"),
|
|
65
|
+
};
|
|
66
|
+
} catch (error) {
|
|
67
|
+
// SAFETY: a spawn failure is an ErrnoException; only its message is shown.
|
|
68
|
+
return { command, failure: (error as Error).message };
|
|
69
|
+
}
|
|
70
|
+
};
|
|
@@ -119,6 +119,13 @@ export const collectAnswers = async (
|
|
|
119
119
|
},
|
|
120
120
|
{ hint: "A Notion database", label: "notion", value: "notion" },
|
|
121
121
|
{ hint: "A Sanity dataset", label: "sanity", value: "sanity" },
|
|
122
|
+
{
|
|
123
|
+
hint: "A Contentful content type",
|
|
124
|
+
label: "contentful",
|
|
125
|
+
value: "contentful",
|
|
126
|
+
},
|
|
127
|
+
{ hint: "A Payload collection", label: "payload", value: "payload" },
|
|
128
|
+
{ hint: "A Strapi content type", label: "strapi", value: "strapi" },
|
|
122
129
|
{
|
|
123
130
|
hint: "MDX fetched from a GitHub repo",
|
|
124
131
|
label: "mdx-remote",
|