blume 1.7.3 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +19 -0
- package/CHANGELOG.md +245 -0
- package/README.md +34 -21
- package/dist/cli/{chunk-vacwm2hv.js → chunk-27g6wdth.js} +2 -2
- package/dist/cli/{chunk-ps4m1xh4.js → chunk-2hn4b8z7.js} +513 -550
- package/dist/cli/chunk-2hn4b8z7.js.map +12 -0
- package/dist/cli/chunk-5shv93fd.js +39 -0
- package/dist/cli/chunk-5shv93fd.js.map +10 -0
- package/dist/cli/chunk-6crbhc3x.js +361 -0
- package/dist/cli/chunk-6crbhc3x.js.map +14 -0
- package/dist/cli/{chunk-8cjtbafj.js → chunk-6hsn950k.js} +109 -383
- package/dist/cli/chunk-6hsn950k.js.map +10 -0
- package/dist/cli/chunk-6vm74dry.js +148 -0
- package/dist/cli/chunk-6vm74dry.js.map +10 -0
- package/dist/cli/{chunk-yg63d42r.js → chunk-79jhk4py.js} +87 -58
- package/dist/cli/chunk-79jhk4py.js.map +35 -0
- package/dist/cli/chunk-82bbrxdn.js +51 -0
- package/dist/cli/chunk-82bbrxdn.js.map +10 -0
- package/dist/cli/chunk-abh8yjkn.js +31 -0
- package/dist/cli/chunk-abh8yjkn.js.map +10 -0
- package/dist/cli/chunk-ah61y8py.js +75 -0
- package/dist/cli/chunk-ah61y8py.js.map +11 -0
- package/dist/cli/{chunk-dwgcp5sm.js → chunk-ce574jw2.js} +1 -1
- package/dist/cli/chunk-ch6g3ar0.js +102 -0
- package/dist/cli/chunk-ch6g3ar0.js.map +10 -0
- package/dist/cli/chunk-dh8cwk36.js +279 -0
- package/dist/cli/chunk-dh8cwk36.js.map +10 -0
- package/dist/cli/{chunk-rqy0s5wh.js → chunk-epjnccmv.js} +17 -16
- package/dist/cli/{chunk-rqy0s5wh.js.map → chunk-epjnccmv.js.map} +3 -3
- package/dist/cli/chunk-f2z5v128.js +97 -0
- package/dist/cli/chunk-f2z5v128.js.map +10 -0
- package/dist/cli/{chunk-2z47ypj8.js → chunk-fa25z98p.js} +16 -3
- package/dist/cli/chunk-fa25z98p.js.map +11 -0
- package/dist/cli/{chunk-1jefwnfs.js → chunk-fs23ddbb.js} +1076 -2592
- package/dist/cli/chunk-fs23ddbb.js.map +35 -0
- package/dist/cli/{chunk-e7f42gdj.js → chunk-fxypxtvm.js} +2 -2
- package/dist/cli/{chunk-bvwwhd84.js → chunk-fz5wtpmh.js} +15 -15
- package/dist/cli/{chunk-bvwwhd84.js.map → chunk-fz5wtpmh.js.map} +1 -1
- package/dist/cli/chunk-hdpx1tax.js +91 -0
- package/dist/cli/chunk-hdpx1tax.js.map +10 -0
- package/dist/cli/{chunk-ct47dqpx.js → chunk-jts8mvcz.js} +67 -7
- package/dist/cli/{chunk-2mzebbbz.js.map → chunk-jts8mvcz.js.map} +6 -4
- package/dist/cli/{chunk-ahnw3kxw.js → chunk-jwyddg7y.js} +27 -22
- package/dist/cli/chunk-jwyddg7y.js.map +15 -0
- package/dist/cli/{chunk-cjtn640a.js → chunk-kdp5q7ke.js} +43 -20
- package/dist/cli/chunk-kdp5q7ke.js.map +10 -0
- package/dist/cli/{chunk-5g0w1e2c.js → chunk-kpf8rrjc.js} +28 -16
- package/dist/cli/{chunk-5g0w1e2c.js.map → chunk-kpf8rrjc.js.map} +4 -4
- package/dist/cli/chunk-m3vmjgmq.js +133 -0
- package/dist/cli/chunk-m3vmjgmq.js.map +10 -0
- package/dist/cli/{chunk-b27xqwn9.js → chunk-mb2919y2.js} +9 -5
- package/dist/cli/chunk-mb2919y2.js.map +10 -0
- package/dist/cli/{chunk-5qk08vmp.js → chunk-q5163e60.js} +133 -54
- package/dist/cli/chunk-q5163e60.js.map +11 -0
- package/dist/cli/chunk-qkqwkpte.js +12437 -0
- package/dist/cli/chunk-qkqwkpte.js.map +182 -0
- package/dist/cli/{chunk-4x36ddpw.js → chunk-qs4q5p4e.js} +81 -87
- package/dist/cli/chunk-qs4q5p4e.js.map +10 -0
- package/dist/cli/{chunk-0xjyb285.js → chunk-qwsrynx5.js} +15 -5
- package/dist/cli/{chunk-0xjyb285.js.map → chunk-qwsrynx5.js.map} +4 -4
- package/dist/cli/chunk-s1p84fyh.js +261 -0
- package/dist/cli/chunk-s1p84fyh.js.map +10 -0
- package/dist/cli/chunk-s6jhgk0q.js +176 -0
- package/dist/cli/chunk-s6jhgk0q.js.map +11 -0
- package/dist/cli/chunk-vtk4a6dg.js +374 -0
- package/dist/cli/chunk-vtk4a6dg.js.map +10 -0
- package/dist/cli/{chunk-k79xp7av.js → chunk-wgm7m9qk.js} +230 -700
- package/dist/cli/chunk-wgm7m9qk.js.map +36 -0
- package/dist/cli/chunk-wm7js3j9.js +145 -0
- package/dist/cli/chunk-wm7js3j9.js.map +11 -0
- package/dist/cli/chunk-yt5n7ppj.js +79 -0
- package/dist/cli/chunk-yt5n7ppj.js.map +10 -0
- package/dist/cli/{chunk-3r45185y.js → chunk-yw7dm696.js} +9 -11
- package/dist/cli/{chunk-3r45185y.js.map → chunk-yw7dm696.js.map} +3 -3
- package/dist/cli/{chunk-nn13znc2.js → chunk-zxcczpyx.js} +1 -1
- package/dist/cli/chunk-zxh4d9vy.js +122 -0
- package/dist/cli/chunk-zxh4d9vy.js.map +11 -0
- package/dist/cli/index.js +214 -57
- package/dist/cli/index.js.map +8 -7
- package/dist/types/ai/agent-readability.d.ts +52 -0
- package/dist/types/ai/ai-catalog.d.ts +42 -0
- package/dist/types/ai/api/paths.d.ts +17 -0
- package/dist/types/ai/api-catalog.d.ts +18 -0
- package/dist/types/ai/ask-context.d.ts +7 -7
- package/dist/types/ai/ask.d.ts +368 -0
- package/dist/types/ai/changelog-markdown.d.ts +2 -0
- package/dist/types/ai/component-markdown.d.ts +2 -2
- package/dist/types/ai/index.d.ts +24 -0
- package/dist/types/ai/link-headers.d.ts +24 -0
- package/dist/types/ai/llms.d.ts +25 -0
- package/dist/types/ai/markdown.d.ts +45 -0
- package/dist/types/ai/mcp/discovery.d.ts +68 -0
- package/dist/types/ai/mcp/tools.d.ts +16 -0
- package/dist/types/ai/openapi-components.d.ts +43 -0
- package/dist/types/ai/relative-links.d.ts +26 -0
- package/dist/types/ai/serializers.d.ts +15 -0
- package/dist/types/ai/skills.d.ts +42 -0
- package/dist/types/ai/tar.d.ts +25 -0
- package/dist/types/ai/visibility.d.ts +17 -0
- package/dist/types/ai/web-bot-auth.d.ts +16 -0
- package/dist/types/analytics/adobe.d.ts +35 -0
- package/dist/types/analytics/amplitude.d.ts +50 -0
- package/dist/types/analytics/clarity.d.ts +31 -0
- package/dist/types/analytics/clearbit.d.ts +29 -0
- package/dist/types/analytics/cloudflare.d.ts +41 -0
- package/dist/types/analytics/fathom.d.ts +41 -0
- package/dist/types/analytics/google-analytics.d.ts +44 -0
- package/dist/types/analytics/google-tag-manager.d.ts +40 -0
- package/dist/types/analytics/head.d.ts +30 -0
- package/dist/types/analytics/heap.d.ts +40 -0
- package/dist/types/analytics/hightouch.d.ts +44 -0
- package/dist/types/analytics/hotjar.d.ts +33 -0
- package/dist/types/analytics/index.d.ts +61 -0
- package/dist/types/analytics/inline.d.ts +17 -0
- package/dist/types/analytics/logrocket.d.ts +44 -0
- package/dist/types/analytics/mixpanel.d.ts +67 -0
- package/dist/types/analytics/pirsch.d.ts +42 -0
- package/dist/types/analytics/plausible.d.ts +56 -0
- package/dist/types/analytics/posthog.d.ts +45 -0
- package/dist/types/analytics/schema.d.ts +320 -0
- package/dist/types/analytics/script.d.ts +46 -0
- package/dist/types/analytics/segment.d.ts +50 -0
- package/dist/types/analytics/vercel.d.ts +48 -0
- package/dist/types/astro/integration.d.ts +76 -0
- package/dist/types/astro/markdown-negotiation.d.ts +23 -0
- package/dist/types/astro/module-types.d.ts +14 -0
- package/dist/types/astro/pages.d.ts +44 -0
- package/dist/types/cli/env.d.ts +12 -0
- package/dist/types/cli/init/scaffold.d.ts +154 -0
- package/dist/types/components/layout/nav-utils.d.ts +11 -0
- package/dist/types/core/adapter.d.ts +47 -0
- package/dist/types/core/api-name.d.ts +7 -0
- package/dist/types/core/changelog-index.d.ts +13 -0
- package/dist/types/core/config-input.d.ts +197 -526
- package/dist/types/core/config.d.ts +61 -35
- package/dist/types/core/content-assets.d.ts +76 -0
- package/dist/types/core/custom-pages.d.ts +33 -0
- package/dist/types/core/data.d.ts +30 -15
- package/dist/types/core/define-components.d.ts +12 -9
- package/dist/types/core/deployment-env.d.ts +6 -11
- package/dist/types/core/frontmatter.d.ts +10 -0
- package/dist/types/core/graph.d.ts +18 -0
- package/dist/types/core/heading-markers.d.ts +54 -0
- package/dist/types/core/i18n-ui.d.ts +12 -10
- package/dist/types/core/i18n.d.ts +87 -0
- package/dist/types/core/includes.d.ts +138 -0
- package/dist/types/core/last-modified.d.ts +47 -0
- package/dist/types/core/links.d.ts +95 -0
- package/dist/types/core/locale-links.d.ts +60 -0
- package/dist/types/core/manifest.d.ts +17 -0
- package/dist/types/core/meta.d.ts +38 -0
- package/dist/types/core/nav-diagnostics.d.ts +26 -0
- package/dist/types/core/navigation.d.ts +6 -0
- package/dist/types/core/node-require.d.ts +19 -0
- package/dist/types/core/package-json.d.ts +13 -0
- package/dist/types/core/probe.d.ts +42 -0
- package/dist/types/core/project-graph.d.ts +51 -0
- package/dist/types/core/project.d.ts +2 -0
- package/dist/types/core/safe-href.d.ts +2 -0
- package/dist/types/core/safe-links.d.ts +26 -0
- package/dist/types/core/schema.d.ts +2284 -454
- package/dist/types/core/site-url.d.ts +16 -0
- package/dist/types/core/sources/assets.d.ts +36 -0
- package/dist/types/core/sources/cache.d.ts +37 -0
- package/dist/types/core/sources/collection.d.ts +28 -0
- package/dist/types/core/sources/contentful-rich-text.d.ts +31 -0
- package/dist/types/core/sources/contentful.d.ts +40 -0
- package/dist/types/core/sources/filesystem.d.ts +24 -0
- package/dist/types/core/sources/github-releases.d.ts +31 -0
- package/dist/types/core/sources/json.d.ts +30 -0
- package/dist/types/core/sources/lexical.d.ts +19 -0
- package/dist/types/core/sources/lower.d.ts +75 -0
- package/dist/types/core/sources/mdx-remote.d.ts +28 -0
- package/dist/types/core/sources/normalize.d.ts +147 -0
- package/dist/types/core/sources/notion.d.ts +131 -0
- package/dist/types/core/sources/obsidian.d.ts +46 -0
- package/dist/types/core/sources/payload.d.ts +39 -0
- package/dist/types/core/sources/portable-text.d.ts +42 -0
- package/dist/types/core/sources/read.d.ts +23 -0
- package/dist/types/core/sources/remote.d.ts +74 -0
- package/dist/types/core/sources/resolve.d.ts +19 -0
- package/dist/types/core/sources/sanity.d.ts +43 -0
- package/dist/types/core/sources/strapi-blocks.d.ts +12 -0
- package/dist/types/core/sources/strapi.d.ts +33 -0
- package/dist/types/core/sources/types.d.ts +7 -0
- package/dist/types/core/sources/watch.d.ts +45 -0
- package/dist/types/core/text-width.d.ts +11 -0
- package/dist/types/core/types.d.ts +15 -1
- package/dist/types/core/unrecognized-keys.d.ts +7 -0
- package/dist/types/core/versions.d.ts +72 -0
- package/dist/types/core/yaml.d.ts +9 -0
- package/dist/types/deploy/adapter-output.d.ts +45 -0
- package/dist/types/deploy/adapters/cloudflare.d.ts +40 -0
- package/dist/types/deploy/adapters/index.d.ts +29 -0
- package/dist/types/deploy/adapters/netlify.d.ts +37 -0
- package/dist/types/deploy/adapters/node.d.ts +37 -0
- package/dist/types/deploy/adapters/registry.d.ts +133 -0
- package/dist/types/deploy/adapters/types.d.ts +71 -0
- package/dist/types/deploy/adapters/vercel.d.ts +38 -0
- package/dist/types/deploy/artifacts.d.ts +65 -0
- package/dist/types/deploy/cloudflare-negotiation.d.ts +196 -0
- package/dist/types/deploy/function-bundle.d.ts +80 -0
- package/dist/types/deploy/headers.d.ts +50 -0
- package/dist/types/deploy/node-headers.d.ts +42 -0
- package/dist/types/deploy/platforms/cloudflare.d.ts +40 -0
- package/dist/types/deploy/platforms/index.d.ts +18 -0
- package/dist/types/deploy/platforms/netlify.d.ts +13 -0
- package/dist/types/deploy/platforms/node.d.ts +11 -0
- package/dist/types/deploy/platforms/paths.d.ts +27 -0
- package/dist/types/deploy/platforms/static.d.ts +10 -0
- package/dist/types/deploy/platforms/types.d.ts +104 -0
- package/dist/types/deploy/platforms/vercel.d.ts +32 -0
- package/dist/types/deploy/redirects.d.ts +53 -0
- package/dist/types/deploy/robots.d.ts +8 -0
- package/dist/types/deploy/rss.d.ts +31 -0
- package/dist/types/deploy/sitemap.d.ts +21 -0
- package/dist/types/deploy/vercel-negotiation.d.ts +109 -0
- package/dist/types/markdown/code-title.d.ts +32 -0
- package/dist/types/markdown/fence-meta.d.ts +23 -0
- package/dist/types/markdown/themes.d.ts +3 -3
- package/dist/types/openapi/asyncapi.d.ts +129 -0
- package/dist/types/openapi/graphql-build.d.ts +8 -0
- package/dist/types/openapi/graphql.d.ts +122 -0
- package/dist/types/openapi/model.d.ts +158 -0
- package/dist/types/openapi/parse.d.ts +57 -0
- package/dist/types/openapi/references.d.ts +37 -25
- package/dist/types/openapi/render-mdx.d.ts +33 -0
- package/dist/types/openapi/sentence.d.ts +7 -0
- package/dist/types/openapi/signature.d.ts +10 -0
- package/dist/types/openapi/source.d.ts +22 -0
- package/dist/types/openapi/spec-dependency-error.d.ts +10 -0
- package/dist/types/reference/asyncapi.d.ts +166 -0
- package/dist/types/reference/graphql.d.ts +181 -0
- package/dist/types/reference/index.d.ts +32 -0
- package/dist/types/reference/openapi.d.ts +165 -0
- package/dist/types/reference/options.d.ts +157 -0
- package/dist/types/reference/scalar.d.ts +136 -0
- package/dist/types/reference/schema.d.ts +630 -0
- package/dist/types/search/adapters/algolia.d.ts +32 -0
- package/dist/types/search/adapters/flexsearch.d.ts +12 -0
- package/dist/types/search/adapters/index.d.ts +31 -0
- package/dist/types/search/adapters/mixedbread.d.ts +22 -0
- package/dist/types/search/adapters/orama-cloud.d.ts +33 -0
- package/dist/types/search/adapters/orama.d.ts +13 -0
- package/dist/types/search/adapters/pagefind.d.ts +12 -0
- package/dist/types/search/adapters/registry.d.ts +228 -0
- package/dist/types/search/adapters/types.d.ts +34 -0
- package/dist/types/search/adapters/typesense.d.ts +42 -0
- package/dist/types/search/build.d.ts +23 -0
- package/dist/types/search/documents.d.ts +90 -0
- package/dist/types/search/facets.d.ts +3 -0
- package/dist/types/search/orama-index.d.ts +1 -1
- package/dist/types/search/sync/algolia.d.ts +14 -0
- package/dist/types/search/sync/index.d.ts +14 -0
- package/dist/types/search/sync/orama-cloud.d.ts +10 -0
- package/dist/types/search/sync/typesense.d.ts +14 -0
- package/dist/types/sources/contentful.d.ts +68 -0
- package/dist/types/sources/custom.d.ts +20 -0
- package/dist/types/sources/filesystem.d.ts +42 -0
- package/dist/types/sources/github-releases.d.ts +46 -0
- package/dist/types/sources/index.d.ts +48 -0
- package/dist/types/sources/mdx-remote.d.ts +63 -0
- package/dist/types/sources/notion.d.ts +65 -0
- package/dist/types/sources/obsidian.d.ts +34 -0
- package/dist/types/sources/payload.d.ts +68 -0
- package/dist/types/sources/registry.d.ts +1414 -0
- package/dist/types/sources/sanity.d.ts +69 -0
- package/dist/types/sources/shared.d.ts +46 -0
- package/dist/types/sources/strapi.d.ts +66 -0
- package/dist/types/theme/icon-kind.d.ts +11 -0
- package/dist/types/theme/icons.d.ts +20 -0
- package/docs/01-quickstart.mdx +18 -18
- package/docs/02-deployment.mdx +52 -28
- package/docs/03-upgrading.mdx +364 -0
- package/docs/04-migrating.mdx +58 -0
- package/docs/08-faq.mdx +5 -5
- package/docs/advanced/blog.mdx +13 -6
- package/docs/advanced/changelog.mdx +23 -35
- package/docs/advanced/custom-pages.mdx +22 -10
- package/docs/advanced/meta.ts +1 -8
- package/docs/advanced/skills.mdx +8 -0
- package/docs/cli/audit.mdx +646 -0
- package/docs/cli/doctor.mdx +29 -0
- package/docs/{reference/eval.mdx → cli/evals.mdx} +12 -11
- package/docs/cli/index.mdx +105 -0
- package/docs/cli/meta.ts +7 -0
- package/docs/{reference → cli}/translate.mdx +9 -9
- package/docs/cli/validate.mdx +41 -0
- package/docs/cli/version.mdx +40 -0
- package/docs/configuration/analytics.mdx +350 -59
- package/docs/configuration/assistant.mdx +357 -0
- package/docs/configuration/customization.mdx +16 -10
- package/docs/configuration/index.mdx +50 -31
- package/docs/configuration/meta.ts +1 -1
- package/docs/configuration/search.mdx +76 -55
- package/docs/configuration/theming.mdx +24 -15
- package/docs/content/components.mdx +21 -5
- package/docs/{reference → content}/frontmatter.mdx +35 -1
- package/docs/content/i18n.mdx +9 -7
- package/docs/content/includes.mdx +2 -4
- package/docs/content/index.mdx +1 -1
- package/docs/content/islands.mdx +11 -6
- package/docs/content/meta.mdx +1 -1
- package/docs/content/meta.ts +1 -0
- package/docs/content/navigation.mdx +9 -7
- package/docs/content/sources.mdx +145 -50
- package/docs/content/syntax.mdx +16 -12
- package/docs/content/versioning.mdx +3 -3
- package/docs/discoverability/agent-discovery.mdx +12 -12
- package/docs/discoverability/index.mdx +4 -4
- package/docs/discoverability/json-api.mdx +4 -4
- package/docs/discoverability/llms-txt.mdx +6 -6
- package/docs/discoverability/markdown.mdx +4 -4
- package/docs/discoverability/mcp.mdx +11 -11
- package/docs/discoverability/sitemap-and-robots.mdx +3 -3
- package/docs/index.mdx +4 -4
- package/docs/references/asyncapi.mdx +59 -0
- package/docs/{advanced → references}/graphql.mdx +45 -32
- package/docs/{reference → references}/meta.ts +2 -2
- package/docs/references/openapi.mdx +171 -0
- package/docs/references/scalar.mdx +64 -0
- package/package.json +42 -8
- package/skills/blume/SKILL.md +23 -10
- package/skills/blume-migrate/SKILL.md +22 -21
- package/skills/blume-migrate/assets/oxfmt@0.67.0.patch +49 -0
- package/skills/blume-migrate/references/docusaurus.md +5 -4
- package/skills/blume-migrate/references/fumadocs.md +4 -4
- package/skills/blume-migrate/references/mintlify.md +23 -8
- package/skills/blume-migrate/references/monorepo.md +6 -6
- package/skills/blume-migrate/references/starlight.md +4 -4
- package/src/ai/agent-readability.ts +25 -26
- package/src/ai/ai-catalog.ts +50 -32
- package/src/ai/api/handlers.ts +46 -11
- package/src/ai/api/paths.ts +1 -1
- package/src/ai/api-catalog.ts +8 -8
- package/src/ai/ask-context.ts +7 -7
- package/src/ai/ask-data.ts +3 -3
- package/src/ai/ask.ts +637 -100
- package/src/ai/changelog-markdown.ts +91 -0
- package/src/ai/component-markdown.ts +328 -12
- package/src/ai/cors.ts +3 -3
- package/src/ai/index.ts +45 -0
- package/src/ai/link-headers.ts +7 -6
- package/src/ai/llms.ts +20 -15
- package/src/ai/markdown.ts +35 -5
- package/src/ai/mcp/data.ts +9 -5
- package/src/ai/openapi-components.ts +5 -2
- package/src/ai/relative-links.ts +170 -0
- package/src/ai/serializers.ts +3 -3
- package/src/ai/skills.ts +1 -1
- package/src/ai/visibility.ts +1 -1
- package/src/ai/web-bot-auth.ts +2 -2
- package/src/analytics/adobe.ts +46 -0
- package/src/analytics/amplitude.ts +79 -0
- package/src/analytics/clarity.ts +46 -0
- package/src/analytics/clearbit.ts +47 -0
- package/src/analytics/cloudflare.ts +67 -0
- package/src/analytics/fathom.ts +64 -0
- package/src/analytics/google-analytics.ts +84 -0
- package/src/analytics/google-tag-manager.ts +61 -0
- package/src/analytics/head.ts +130 -0
- package/src/analytics/heap.ts +65 -0
- package/src/analytics/hightouch.ts +77 -0
- package/src/analytics/hotjar.ts +47 -0
- package/src/analytics/index.ts +71 -0
- package/src/analytics/inline.ts +21 -0
- package/src/analytics/logrocket.ts +71 -0
- package/src/analytics/mixpanel.ts +92 -0
- package/src/analytics/pirsch.ts +66 -0
- package/src/analytics/plausible.ts +83 -0
- package/src/analytics/posthog.ts +78 -0
- package/src/analytics/schema.ts +60 -0
- package/src/analytics/script.ts +60 -0
- package/src/analytics/segment.ts +85 -0
- package/src/analytics/vercel.ts +50 -0
- package/src/astro/adapter-root.ts +7 -9
- package/src/astro/component-slots.ts +131 -91
- package/src/astro/generate.ts +129 -361
- package/src/astro/integration.ts +2 -6
- package/src/astro/module-types.ts +1 -1
- package/src/astro/pages.ts +13 -101
- package/src/astro/render-deps.ts +379 -0
- package/src/astro/runtime-deps.ts +201 -0
- package/src/astro/templates.ts +575 -562
- package/src/audit/agent.ts +24 -0
- package/src/audit/catalog.ts +2 -2
- package/src/audit/checks/assets.ts +2 -2
- package/src/audit/checks/dns-aid.ts +1 -1
- package/src/audit/checks/duplicates.ts +3 -1
- package/src/audit/checks/i18n.ts +1 -1
- package/src/audit/checks/indexability.ts +7 -7
- package/src/audit/checks/links.ts +2 -2
- package/src/audit/checks/llms.ts +6 -6
- package/src/audit/checks/network.ts +3 -3
- package/src/audit/checks/og-image.ts +2 -2
- package/src/audit/checks/robots.ts +1 -1
- package/src/audit/checks/sitemap.ts +2 -2
- package/src/audit/checks/social.ts +1 -1
- package/src/audit/run.ts +4 -3
- package/src/audit/terms.ts +31 -0
- package/src/audit/url.ts +13 -13
- package/src/blume-modules.d.ts +2 -2
- package/src/cli/command-meta.ts +10 -0
- package/src/cli/commands/audit.ts +40 -21
- package/src/cli/commands/build.ts +71 -316
- package/src/cli/commands/check.ts +1 -0
- package/src/cli/commands/dev.ts +40 -1
- package/src/cli/commands/doctor.ts +92 -14
- package/src/cli/commands/eject.ts +44 -7
- package/src/cli/commands/eval.ts +5 -5
- package/src/cli/commands/init.ts +161 -41
- package/src/cli/commands/migrate.ts +121 -0
- package/src/cli/commands/preview.ts +7 -1
- package/src/cli/commands/translate.ts +5 -5
- package/src/cli/commands/upgrade.ts +141 -0
- package/src/cli/commands/version.ts +57 -44
- package/src/cli/eject-scripts.ts +121 -6
- package/src/cli/index.ts +11 -1
- package/src/cli/init/install.ts +70 -0
- package/src/cli/init/questions.ts +7 -0
- package/src/cli/init/scaffold.ts +459 -75
- package/src/cli/lazy-command.ts +37 -1
- package/src/cli/prepare.ts +40 -6
- package/src/cli/required-secrets.ts +39 -12
- package/src/cli/unknown-flags.ts +266 -0
- package/src/cli/yarn-pnp.ts +52 -0
- package/src/components/content/AccordionItem.astro +7 -1
- package/src/components/content/Card.astro +4 -3
- package/src/components/content/ColorItem.astro +22 -4
- package/src/components/content/GithubInfo.astro +2 -2
- package/src/components/content/Prompt.astro +25 -25
- package/src/components/content/Tabs.astro +3 -1
- package/src/components/content/Tile.astro +2 -3
- package/src/components/content/Tooltip.astro +57 -9
- package/src/components/content/content-strings.ts +34 -0
- package/src/components/content/diff.ts +1 -1
- package/src/components/content/mermaid-element.ts +13 -2
- package/src/components/content/prompt-markdown.ts +292 -0
- package/src/components/content/tooltip-id.ts +41 -0
- package/src/components/copy-feedback.ts +1 -1
- package/src/components/islands/{AskAI.astro → Assistant.astro} +10 -10
- package/src/components/islands/{ask-ai.tsx → assistant.tsx} +23 -23
- package/src/components/islands/hooks.ts +36 -11
- package/src/components/layout/Analytics.astro +21 -79
- package/src/components/layout/Banner.astro +3 -1
- package/src/components/layout/DiscoveryLinks.astro +69 -0
- package/src/components/layout/Header.astro +93 -30
- package/src/components/layout/LanguageSwitcher.astro +4 -1
- package/src/components/layout/Logo.astro +23 -2
- package/src/components/layout/NavSelector.astro +13 -2
- package/src/components/layout/NavTree.astro +12 -3
- package/src/components/layout/NavTreeScript.astro +17 -3
- package/src/components/layout/PageActions.astro +3 -3
- package/src/components/layout/PageFeedback.astro +11 -1
- package/src/components/layout/PageLayout.astro +58 -11
- package/src/components/layout/Pagination.astro +7 -7
- package/src/components/layout/ReferenceLayout.astro +22 -13
- package/src/components/layout/RootLayout.astro +75 -72
- package/src/components/layout/Search.astro +43 -19
- package/src/components/layout/WebMcp.astro +1 -1
- package/src/components/layout/analytics-client.ts +73 -16
- package/src/components/layout/drawer-inert.ts +113 -15
- package/src/components/layout/dropdown-clamp.ts +105 -0
- package/src/components/layout/head-scripts.ts +15 -6
- package/src/components/layout/nav-utils.ts +17 -0
- package/src/components/layout/search/algolia.ts +8 -8
- package/src/components/layout/search/orama-cloud.ts +9 -7
- package/src/components/layout/search/typesense.ts +11 -17
- package/src/components/openapi/MessageComposer.astro +2 -2
- package/src/components/openapi/Playground.astro +2 -2
- package/src/components/openapi/description.ts +2 -2
- package/src/components/openapi/playground-client.ts +79 -10
- package/src/core/changelog-index.ts +24 -0
- package/src/core/code-fences.ts +1 -1
- package/src/core/component-overrides.ts +399 -154
- package/src/core/config-input.ts +201 -566
- package/src/core/config.ts +131 -42
- package/src/core/custom-pages.ts +105 -0
- package/src/core/data.ts +34 -15
- package/src/core/define-components.ts +12 -9
- package/src/core/deployment-env.ts +18 -74
- package/src/core/diagnostics.ts +14 -7
- package/src/core/graph.ts +69 -25
- package/src/core/i18n-ui.ts +41 -11
- package/src/core/i18n.ts +17 -0
- package/src/core/includes.ts +156 -38
- package/src/core/last-modified.ts +6 -11
- package/src/core/links.ts +166 -2
- package/src/core/manifest.ts +10 -3
- package/src/core/navigation.ts +115 -16
- package/src/core/new-tab.ts +35 -0
- package/src/core/node-require.ts +21 -0
- package/src/core/project-graph.ts +42 -26
- package/src/core/project.ts +9 -4
- package/src/core/request-body.ts +61 -0
- package/src/core/safe-href.ts +28 -0
- package/src/core/safe-links.ts +68 -0
- package/src/core/schema.ts +528 -745
- package/src/core/server-features.ts +10 -11
- package/src/core/sources/assets.ts +47 -11
- package/src/core/sources/collection.ts +67 -0
- package/src/core/sources/contentful-rich-text.ts +285 -0
- package/src/core/sources/contentful.ts +173 -0
- package/src/core/sources/github-releases.ts +51 -1
- package/src/core/sources/json.ts +71 -0
- package/src/core/sources/lexical.ts +195 -0
- package/src/core/sources/lower.ts +226 -0
- package/src/core/sources/normalize.ts +52 -2
- package/src/core/sources/notion.ts +39 -28
- package/src/core/sources/payload.ts +135 -0
- package/src/core/sources/portable-text.ts +11 -16
- package/src/core/sources/remote.ts +226 -0
- package/src/core/sources/resolve.ts +104 -166
- package/src/core/sources/sanity.ts +16 -49
- package/src/core/sources/strapi-blocks.ts +124 -0
- package/src/core/sources/strapi.ts +191 -0
- package/src/core/sources/types.ts +12 -1
- package/src/core/types.ts +15 -1
- package/src/core/ui-packs/ar.ts +10 -7
- package/src/core/ui-packs/bg.ts +10 -7
- package/src/core/ui-packs/bn.ts +10 -7
- package/src/core/ui-packs/ca.ts +7 -6
- package/src/core/ui-packs/cs.ts +10 -7
- package/src/core/ui-packs/da.ts +10 -7
- package/src/core/ui-packs/de.ts +10 -7
- package/src/core/ui-packs/el.ts +7 -6
- package/src/core/ui-packs/es.ts +7 -6
- package/src/core/ui-packs/fa.ts +10 -7
- package/src/core/ui-packs/fi.ts +10 -7
- package/src/core/ui-packs/fr.ts +7 -6
- package/src/core/ui-packs/he.ts +10 -7
- package/src/core/ui-packs/hi.ts +10 -7
- package/src/core/ui-packs/hr.ts +10 -7
- package/src/core/ui-packs/hu.ts +10 -7
- package/src/core/ui-packs/id.ts +10 -7
- package/src/core/ui-packs/it.ts +7 -6
- package/src/core/ui-packs/ja.ts +7 -6
- package/src/core/ui-packs/ko.ts +7 -6
- package/src/core/ui-packs/nl.ts +10 -7
- package/src/core/ui-packs/no.ts +10 -7
- package/src/core/ui-packs/pl.ts +10 -7
- package/src/core/ui-packs/pt-br.ts +7 -6
- package/src/core/ui-packs/pt.ts +7 -6
- package/src/core/ui-packs/ro.ts +10 -7
- package/src/core/ui-packs/ru.ts +10 -7
- package/src/core/ui-packs/sk.ts +10 -7
- package/src/core/ui-packs/sr.ts +10 -7
- package/src/core/ui-packs/sv.ts +10 -7
- package/src/core/ui-packs/th.ts +7 -6
- package/src/core/ui-packs/tr.ts +10 -7
- package/src/core/ui-packs/uk.ts +10 -7
- package/src/core/ui-packs/vi.ts +7 -6
- package/src/core/ui-packs/zh-tw.ts +7 -6
- package/src/core/ui-packs/zh.ts +7 -6
- package/src/core/unrecognized-keys.ts +10 -0
- package/src/core/version-cut.ts +116 -8
- package/src/deploy/adapter-output.ts +57 -97
- package/src/deploy/adapters/cloudflare.ts +39 -0
- package/src/deploy/adapters/index.ts +41 -0
- package/src/deploy/adapters/netlify.ts +34 -0
- package/src/deploy/adapters/node.ts +34 -0
- package/src/deploy/adapters/registry.ts +127 -0
- package/src/deploy/adapters/types.ts +92 -0
- package/src/deploy/adapters/vercel.ts +35 -0
- package/src/deploy/artifacts.ts +55 -27
- package/src/deploy/cloudflare-negotiation.ts +179 -100
- package/src/deploy/function-bundle.ts +18 -3
- package/src/deploy/headers.ts +124 -23
- package/src/deploy/node-headers.ts +198 -0
- package/src/deploy/platforms/cloudflare.ts +312 -0
- package/src/deploy/platforms/index.ts +67 -0
- package/src/deploy/platforms/netlify.ts +52 -0
- package/src/deploy/platforms/node.ts +40 -0
- package/src/deploy/platforms/paths.ts +42 -0
- package/src/deploy/platforms/static.ts +29 -0
- package/src/deploy/platforms/types.ts +112 -0
- package/src/deploy/platforms/vercel.ts +193 -0
- package/src/deploy/redirects.ts +30 -18
- package/src/deploy/robots.ts +3 -3
- package/src/deploy/rss.ts +2 -2
- package/src/deploy/sitemap.ts +2 -2
- package/src/deploy/vercel-negotiation.ts +2 -2
- package/src/eval/agents.ts +32 -1
- package/src/eval/findings.ts +19 -11
- package/src/eval/report.ts +10 -2
- package/src/markdown/external-links.ts +65 -0
- package/src/markdown/include.ts +45 -27
- package/src/markdown/index.ts +34 -9
- package/src/markdown/inline-code.ts +12 -6
- package/src/markdown/relative-links.ts +324 -0
- package/src/markdown/themes.ts +3 -3
- package/src/migrate/migrate.ts +149 -0
- package/src/openapi/parse.ts +64 -16
- package/src/openapi/proxy.ts +62 -10
- package/src/openapi/references.ts +147 -147
- package/src/openapi/render-mdx.ts +32 -10
- package/src/openapi/scalar.ts +15 -13
- package/src/openapi/sentence.ts +14 -0
- package/src/openapi/source.ts +37 -21
- package/src/openapi/spec-dependency-error.ts +15 -0
- package/src/reference/asyncapi.ts +83 -0
- package/src/reference/graphql.ts +89 -0
- package/src/reference/index.ts +40 -0
- package/src/reference/openapi.ts +83 -0
- package/src/reference/options.ts +201 -0
- package/src/reference/scalar.ts +136 -0
- package/src/reference/schema.ts +88 -0
- package/src/registry/eject.ts +109 -53
- package/src/search/adapters/algolia.ts +46 -0
- package/src/search/adapters/flexsearch.ts +29 -0
- package/src/search/adapters/index.ts +39 -0
- package/src/search/adapters/mixedbread.ts +39 -0
- package/src/search/adapters/orama-cloud.ts +51 -0
- package/src/search/adapters/orama.ts +24 -0
- package/src/search/adapters/pagefind.ts +27 -0
- package/src/search/adapters/registry.ts +131 -0
- package/src/search/adapters/types.ts +46 -0
- package/src/search/adapters/typesense.ts +57 -0
- package/src/search/build.ts +8 -4
- package/src/search/documents.ts +8 -2
- package/src/search/orama-index.ts +1 -1
- package/src/search/sync/algolia.ts +12 -11
- package/src/search/sync/index.ts +35 -20
- package/src/search/sync/orama-cloud.ts +12 -9
- package/src/search/sync/typesense.ts +15 -13
- package/src/sources/contentful.ts +63 -0
- package/src/sources/custom.ts +38 -0
- package/src/sources/filesystem.ts +51 -0
- package/src/sources/github-releases.ts +52 -0
- package/src/sources/index.ts +60 -0
- package/src/sources/mdx-remote.ts +76 -0
- package/src/sources/notion.ts +63 -0
- package/src/sources/obsidian.ts +38 -0
- package/src/sources/payload.ts +60 -0
- package/src/sources/registry.ts +182 -0
- package/src/sources/sanity.ts +66 -0
- package/src/sources/shared.ts +52 -0
- package/src/sources/strapi.ts +58 -0
- package/src/theme/entry.ts +24 -2
- package/src/translate/report.ts +40 -7
- package/src/upgrade/upgrade.ts +499 -0
- package/dist/cli/chunk-0qymqwzz.js +0 -164
- package/dist/cli/chunk-0qymqwzz.js.map +0 -15
- package/dist/cli/chunk-1jefwnfs.js.map +0 -48
- package/dist/cli/chunk-2mzebbbz.js +0 -69
- package/dist/cli/chunk-2z47ypj8.js.map +0 -11
- package/dist/cli/chunk-4x36ddpw.js.map +0 -11
- package/dist/cli/chunk-5093q3n7.js +0 -68
- package/dist/cli/chunk-5093q3n7.js.map +0 -10
- package/dist/cli/chunk-5qk08vmp.js.map +0 -11
- package/dist/cli/chunk-7s8hm3b6.js +0 -5347
- package/dist/cli/chunk-7s8hm3b6.js.map +0 -58
- package/dist/cli/chunk-8cjtbafj.js.map +0 -13
- package/dist/cli/chunk-97r59kpr.js +0 -381
- package/dist/cli/chunk-97r59kpr.js.map +0 -12
- package/dist/cli/chunk-ahnw3kxw.js.map +0 -15
- package/dist/cli/chunk-b27xqwn9.js.map +0 -10
- package/dist/cli/chunk-bf6bt1xt.js +0 -185
- package/dist/cli/chunk-bf6bt1xt.js.map +0 -11
- package/dist/cli/chunk-cjtn640a.js.map +0 -10
- package/dist/cli/chunk-ct47dqpx.js.map +0 -11
- package/dist/cli/chunk-esphfr8p.js +0 -107
- package/dist/cli/chunk-esphfr8p.js.map +0 -11
- package/dist/cli/chunk-ex56aa81.js +0 -1016
- package/dist/cli/chunk-ex56aa81.js.map +0 -13
- package/dist/cli/chunk-garjf5z9.js +0 -30
- package/dist/cli/chunk-garjf5z9.js.map +0 -10
- package/dist/cli/chunk-js7saxwm.js +0 -1045
- package/dist/cli/chunk-js7saxwm.js.map +0 -22
- package/dist/cli/chunk-k79xp7av.js.map +0 -39
- package/dist/cli/chunk-ps4m1xh4.js.map +0 -15
- package/dist/cli/chunk-q4rae3bg.js +0 -60
- package/dist/cli/chunk-q4rae3bg.js.map +0 -10
- package/dist/cli/chunk-rz9jmfhz.js +0 -108
- package/dist/cli/chunk-rz9jmfhz.js.map +0 -10
- package/dist/cli/chunk-vh9w1sgp.js +0 -73
- package/dist/cli/chunk-vh9w1sgp.js.map +0 -10
- package/dist/cli/chunk-vrfp10qk.js +0 -81
- package/dist/cli/chunk-vrfp10qk.js.map +0 -10
- package/dist/cli/chunk-yg63d42r.js.map +0 -34
- package/docs/advanced/api-reference.mdx +0 -240
- package/docs/configuration/ask-ai.mdx +0 -256
- package/docs/reference/cli.mdx +0 -197
- package/skills/blume-migrate/assets/oxfmt@0.55.0.patch +0 -20
- package/src/components/content/changelog-element.ts +0 -69
- package/src/search/providers.ts +0 -91
- /package/dist/cli/{chunk-vacwm2hv.js.map → chunk-27g6wdth.js.map} +0 -0
- /package/dist/cli/{chunk-dwgcp5sm.js.map → chunk-ce574jw2.js.map} +0 -0
- /package/dist/cli/{chunk-e7f42gdj.js.map → chunk-fxypxtvm.js.map} +0 -0
- /package/dist/cli/{chunk-nn13znc2.js.map → chunk-zxcczpyx.js.map} +0 -0
|
@@ -1,15 +1,24 @@
|
|
|
1
1
|
import { readFileSync } from "node:fs";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
2
3
|
|
|
3
4
|
import { defineCommand } from "citty";
|
|
4
5
|
import { join } from "pathe";
|
|
5
6
|
import { satisfies } from "semver";
|
|
6
7
|
|
|
8
|
+
import { discoverIslands } from "../../astro/islands.ts";
|
|
9
|
+
import { missingDependencyDiagnostic } from "../../astro/runtime-deps.ts";
|
|
10
|
+
import {
|
|
11
|
+
analyzeComponentOverrides,
|
|
12
|
+
ComponentOverridesError,
|
|
13
|
+
} from "../../core/component-overrides.ts";
|
|
7
14
|
import { BlumeError } from "../../core/diagnostics.ts";
|
|
8
15
|
import { packageRoot } from "../../core/package-root.ts";
|
|
9
16
|
import { scanProject } from "../../core/project-graph.ts";
|
|
10
17
|
import { serverFeatures } from "../../core/server-features.ts";
|
|
11
18
|
import type { Diagnostic } from "../../core/types.ts";
|
|
19
|
+
import { unregisteredSnapshotDiagnostics } from "../../core/version-cut.ts";
|
|
12
20
|
import { commandMeta } from "../command-meta.ts";
|
|
21
|
+
import { loadEnvFiles } from "../env.ts";
|
|
13
22
|
import { reportInternalError } from "../internal-error.ts";
|
|
14
23
|
import {
|
|
15
24
|
flushStdout,
|
|
@@ -17,9 +26,36 @@ import {
|
|
|
17
26
|
reportDiagnostics,
|
|
18
27
|
reportDiagnosticsJson,
|
|
19
28
|
} from "../log.ts";
|
|
29
|
+
import { checkRequiredSecrets } from "../required-secrets.ts";
|
|
20
30
|
|
|
21
31
|
const FALLBACK_NODE_RANGE = ">=22.12.0";
|
|
22
32
|
|
|
33
|
+
/**
|
|
34
|
+
* Plan `components.ts` the way `blume dev`/`build` do, reporting each override
|
|
35
|
+
* that can't be planned — a non-static form, or an import of a file that
|
|
36
|
+
* doesn't exist — with its own line. The scan alone never reads the file, so
|
|
37
|
+
* without this doctor would pass a project whose build fails.
|
|
38
|
+
*/
|
|
39
|
+
const componentsDiagnostics = async (
|
|
40
|
+
componentsFile: string | null
|
|
41
|
+
): Promise<Diagnostic[]> => {
|
|
42
|
+
if (!componentsFile) {
|
|
43
|
+
return [];
|
|
44
|
+
}
|
|
45
|
+
try {
|
|
46
|
+
analyzeComponentOverrides(
|
|
47
|
+
await readFile(componentsFile, "utf-8"),
|
|
48
|
+
componentsFile
|
|
49
|
+
);
|
|
50
|
+
return [];
|
|
51
|
+
} catch (error) {
|
|
52
|
+
if (error instanceof ComponentOverridesError) {
|
|
53
|
+
return error.issues;
|
|
54
|
+
}
|
|
55
|
+
throw error;
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
|
|
23
59
|
/** The supported Node range, read from the package's own `engines` field so
|
|
24
60
|
* doctor can never drift from what the package actually declares. */
|
|
25
61
|
const supportedNodeRange = (): string => {
|
|
@@ -56,33 +92,75 @@ export const doctorCommand = defineCommand({
|
|
|
56
92
|
});
|
|
57
93
|
}
|
|
58
94
|
|
|
95
|
+
// Read `.env` files first, as `blume dev`/`build` do: remote sources read
|
|
96
|
+
// their tokens during the scan, and the secrets check below reads them too.
|
|
97
|
+
loadEnvFiles(root);
|
|
98
|
+
|
|
59
99
|
try {
|
|
60
100
|
const project = await scanProject(root, { mode: "build" });
|
|
61
|
-
diagnostics.push(
|
|
101
|
+
diagnostics.push(
|
|
102
|
+
...project.diagnostics,
|
|
103
|
+
...unregisteredSnapshotDiagnostics(project)
|
|
104
|
+
);
|
|
62
105
|
|
|
63
106
|
const { config } = project;
|
|
107
|
+
// The packages and secrets a build would need: an adapter's missing SDK
|
|
108
|
+
// fails the build, and a missing secret fails at the first request.
|
|
109
|
+
const { islands } = await discoverIslands(root);
|
|
110
|
+
const dependencies = await missingDependencyDiagnostic(
|
|
111
|
+
config,
|
|
112
|
+
root,
|
|
113
|
+
"error",
|
|
114
|
+
islands.map((island) => island.framework)
|
|
115
|
+
);
|
|
116
|
+
if (dependencies) {
|
|
117
|
+
diagnostics.push(dependencies);
|
|
118
|
+
}
|
|
119
|
+
diagnostics.push(
|
|
120
|
+
...(await componentsDiagnostics(project.context.componentsFile)),
|
|
121
|
+
...checkRequiredSecrets(config)
|
|
122
|
+
);
|
|
64
123
|
const features = serverFeatures(config);
|
|
65
|
-
if (
|
|
124
|
+
if (
|
|
125
|
+
features.length > 0 &&
|
|
126
|
+
config.deployment.options.output === "static"
|
|
127
|
+
) {
|
|
128
|
+
// A host adapter already names the target, so only its
|
|
129
|
+
// `output: "static"` stands in the way; otherwise name one.
|
|
130
|
+
const { kind } = config.deployment;
|
|
66
131
|
diagnostics.push({
|
|
67
132
|
code: "BLUME_SERVER_FEATURE_REQUIRED",
|
|
68
|
-
message: `${features.join(", ")} require server output.`,
|
|
69
|
-
severity: "error",
|
|
70
|
-
suggestion: 'Set deployment.output to "server".',
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
if (config.deployment.output === "server" && !config.deployment.adapter) {
|
|
74
|
-
diagnostics.push({
|
|
75
|
-
code: "BLUME_ADAPTER_REQUIRED",
|
|
76
|
-
message: "Server output requires an adapter.",
|
|
133
|
+
message: `${features.join(", ")} ${features.length === 1 ? "requires" : "require"} server output.`,
|
|
77
134
|
severity: "error",
|
|
78
|
-
suggestion:
|
|
135
|
+
suggestion:
|
|
136
|
+
kind === "static"
|
|
137
|
+
? 'Set deployment to a host adapter from "blume/deploy" (e.g. `deployment: vercel()`).'
|
|
138
|
+
: `Drop \`output: "static"\` from \`deployment: ${kind}()\` to build for the server.`,
|
|
79
139
|
});
|
|
80
140
|
}
|
|
81
141
|
|
|
82
142
|
if (!args.json) {
|
|
83
143
|
logger.info(`Pages: ${project.graph.pages.length}`);
|
|
84
|
-
logger.info(`Output: ${config.deployment.output}`);
|
|
85
|
-
logger.info(`
|
|
144
|
+
logger.info(`Output: ${config.deployment.options.output}`);
|
|
145
|
+
logger.info(`Adapter: ${config.deployment.kind}`);
|
|
146
|
+
logger.info(`Search: ${config.search.provider.kind}`);
|
|
147
|
+
logger.info(
|
|
148
|
+
`References: ${config.reference.map((adapter) => adapter.kind).join(", ") || "none"}`
|
|
149
|
+
);
|
|
150
|
+
logger.info(
|
|
151
|
+
`Analytics: ${config.analytics.map((adapter) => adapter.kind).join(", ") || "none"}`
|
|
152
|
+
);
|
|
153
|
+
logger.info(
|
|
154
|
+
`Sources: ${config.content.sources.map((source) => source.kind).join(", ")}`
|
|
155
|
+
);
|
|
156
|
+
const { assistant } = config.ai;
|
|
157
|
+
let assistantSummary = "off";
|
|
158
|
+
if (assistant?.enabled) {
|
|
159
|
+
assistantSummary = assistant.endpoint
|
|
160
|
+
? "external endpoint"
|
|
161
|
+
: assistant.provider.kind;
|
|
162
|
+
}
|
|
163
|
+
logger.info(`Assistant: ${assistantSummary}`);
|
|
86
164
|
}
|
|
87
165
|
} catch (error) {
|
|
88
166
|
if (error instanceof BlumeError) {
|
|
@@ -1,15 +1,39 @@
|
|
|
1
1
|
import { defineCommand } from "citty";
|
|
2
2
|
import { relative } from "pathe";
|
|
3
3
|
|
|
4
|
+
import { BlumeError } from "../../core/diagnostics.ts";
|
|
4
5
|
import { eject } from "../../registry/eject.ts";
|
|
5
6
|
import { commandMeta } from "../command-meta.ts";
|
|
6
7
|
import { refuseIfDevRunning } from "../dev-lock.ts";
|
|
7
|
-
import { updatePackageScripts } from "../eject-scripts.ts";
|
|
8
|
+
import { isEjectedProject, updatePackageScripts } from "../eject-scripts.ts";
|
|
8
9
|
import { commandsFor, detectProjectPackageManager } from "../init/scaffold.ts";
|
|
9
|
-
import { logger } from "../log.ts";
|
|
10
|
+
import { logger, reportDiagnostics } from "../log.ts";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Eject the project, reporting a config or `components.ts` error as the same
|
|
14
|
+
* diagnostic other commands print (a Blume 1 config, say) instead of a stack.
|
|
15
|
+
*/
|
|
16
|
+
const ejectOrExit = async (
|
|
17
|
+
root: string
|
|
18
|
+
): Promise<Awaited<ReturnType<typeof eject>>> => {
|
|
19
|
+
try {
|
|
20
|
+
return await eject(root);
|
|
21
|
+
} catch (error) {
|
|
22
|
+
if (error instanceof BlumeError) {
|
|
23
|
+
reportDiagnostics([error.diagnostic], root);
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
throw error;
|
|
27
|
+
}
|
|
28
|
+
};
|
|
10
29
|
|
|
11
30
|
export const ejectCommand = defineCommand({
|
|
12
31
|
args: {
|
|
32
|
+
force: {
|
|
33
|
+
description:
|
|
34
|
+
"Eject again over an already-ejected app, overwriting astro.config.mjs and src/.",
|
|
35
|
+
type: "boolean",
|
|
36
|
+
},
|
|
13
37
|
yes: { description: "Skip the confirmation prompt.", type: "boolean" },
|
|
14
38
|
},
|
|
15
39
|
meta: commandMeta.eject,
|
|
@@ -17,16 +41,25 @@ export const ejectCommand = defineCommand({
|
|
|
17
41
|
const root = process.cwd();
|
|
18
42
|
refuseIfDevRunning(root, "ejecting");
|
|
19
43
|
|
|
44
|
+
// A second eject rewrites the app from blume.config.ts, discarding every
|
|
45
|
+
// edit made to it since the first, so it takes an explicit --force.
|
|
46
|
+
if (isEjectedProject(root) && !args.force) {
|
|
47
|
+
logger.error(
|
|
48
|
+
"This project is already ejected: ejecting again would overwrite astro.config.mjs and src/ with a fresh copy, discarding your edits to them. Pass --force to overwrite them anyway."
|
|
49
|
+
);
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
|
|
20
53
|
if (!args.yes) {
|
|
21
54
|
logger.warn(
|
|
22
|
-
"Eject is one-way: it writes astro.config.mjs, src/, and (if absent) tsconfig.json, rewrites your package.json scripts, and removes .blume. An existing tsconfig.json is left untouched."
|
|
55
|
+
"Eject is one-way: it writes astro.config.mjs, src/, and (if absent) tsconfig.json, rewrites your package.json scripts, adds the packages the Astro app imports to its dependencies, and removes .blume. An existing tsconfig.json is left untouched."
|
|
23
56
|
);
|
|
24
57
|
logger.info("Re-run with --yes to proceed.");
|
|
25
58
|
return;
|
|
26
59
|
}
|
|
27
60
|
|
|
28
|
-
const { files, warnings } = await
|
|
29
|
-
await updatePackageScripts(root);
|
|
61
|
+
const { dependencies, files, warnings } = await ejectOrExit(root);
|
|
62
|
+
const added = await updatePackageScripts(root, dependencies);
|
|
30
63
|
|
|
31
64
|
// The same surface as the generated-runtime path (prepare.ts): one warn
|
|
32
65
|
// per generation warning, e.g. a Scalar reference spec that wasn't found.
|
|
@@ -41,9 +74,13 @@ export const ejectCommand = defineCommand({
|
|
|
41
74
|
// Print run commands matching the project's package manager (lockfile
|
|
42
75
|
// detection, since eject runs inside an existing project).
|
|
43
76
|
const pm = await detectProjectPackageManager(root);
|
|
44
|
-
const { build, dev } = commandsFor(pm);
|
|
77
|
+
const { build, dev, install } = commandsFor(pm);
|
|
78
|
+
// Newly added dependencies aren't installed yet, so install comes first.
|
|
79
|
+
const run = added.length > 0 ? [install, dev, build] : [dev, build];
|
|
80
|
+
const addedNote =
|
|
81
|
+
added.length > 0 ? `Added to package.json: ${added.join(", ")}.\n\n` : "";
|
|
45
82
|
logger.box(
|
|
46
|
-
`Your project is now a standalone Astro app.\n\n
|
|
83
|
+
`Your project is now a standalone Astro app.\n\n${addedNote}${run.map((command) => ` ${command}`).join("\n")}\n\nThe blume package remains importable.`
|
|
47
84
|
);
|
|
48
85
|
},
|
|
49
86
|
});
|
package/src/cli/commands/eval.ts
CHANGED
|
@@ -24,7 +24,7 @@ import type { EvalResult } from "../../eval/run.ts";
|
|
|
24
24
|
import { EvalsFileError, loadEvalsFile } from "../../eval/schema.ts";
|
|
25
25
|
import { commandMeta } from "../command-meta.ts";
|
|
26
26
|
import { reportInternalError } from "../internal-error.ts";
|
|
27
|
-
import { flushStdout, logger } from "../log.ts";
|
|
27
|
+
import { flushStdout, logger, reportDiagnostics } from "../log.ts";
|
|
28
28
|
|
|
29
29
|
const DEFAULT_FILE = "evals.yaml";
|
|
30
30
|
|
|
@@ -82,7 +82,7 @@ interface EvalFlags {
|
|
|
82
82
|
/** Validate the flag surface, exiting with a message on the first offense. */
|
|
83
83
|
const parseFlags = (args: EvalFlags) => {
|
|
84
84
|
if (!isAgentKind(args.agent)) {
|
|
85
|
-
logger.error(`Invalid --agent "${args.agent}" (use
|
|
85
|
+
logger.error(`Invalid --agent "${args.agent}" (use codex | claude).`);
|
|
86
86
|
process.exit(1);
|
|
87
87
|
}
|
|
88
88
|
if (args.action !== undefined && args.action !== "init") {
|
|
@@ -152,8 +152,8 @@ export const evalCommand = defineCommand({
|
|
|
152
152
|
type: "positional",
|
|
153
153
|
},
|
|
154
154
|
agent: {
|
|
155
|
-
default: "
|
|
156
|
-
description: "Agent CLI that reads and grades the docs:
|
|
155
|
+
default: "codex",
|
|
156
|
+
description: "Agent CLI that reads and grades the docs: codex | claude.",
|
|
157
157
|
type: "string",
|
|
158
158
|
},
|
|
159
159
|
file: {
|
|
@@ -232,7 +232,7 @@ export const evalCommand = defineCommand({
|
|
|
232
232
|
process.exit(1);
|
|
233
233
|
}
|
|
234
234
|
if (error instanceof BlumeError) {
|
|
235
|
-
|
|
235
|
+
reportDiagnostics([error.diagnostic], root);
|
|
236
236
|
process.exit(1);
|
|
237
237
|
}
|
|
238
238
|
// SAFETY: only the `code` tag is inspected; a spawn failure throws an
|
package/src/cli/commands/init.ts
CHANGED
|
@@ -6,6 +6,7 @@ import { ensureGitignore } from "../../core/gitignore.ts";
|
|
|
6
6
|
import { eject } from "../../registry/eject.ts";
|
|
7
7
|
import { commandMeta } from "../command-meta.ts";
|
|
8
8
|
import { updatePackageScripts } from "../eject-scripts.ts";
|
|
9
|
+
import { installDependencies } from "../init/install.ts";
|
|
9
10
|
import { collectAnswers } from "../init/questions.ts";
|
|
10
11
|
import {
|
|
11
12
|
applyPlan,
|
|
@@ -14,48 +15,160 @@ import {
|
|
|
14
15
|
detectPackageManager,
|
|
15
16
|
nextSteps,
|
|
16
17
|
PACKAGE_MANAGERS,
|
|
18
|
+
readExistingPackage,
|
|
17
19
|
TEMPLATES,
|
|
18
20
|
validateContentDir,
|
|
21
|
+
workspaceNote,
|
|
19
22
|
} from "../init/scaffold.ts";
|
|
20
23
|
import type { InitAnswers } from "../init/scaffold.ts";
|
|
21
24
|
import { logger } from "../log.ts";
|
|
22
25
|
|
|
26
|
+
/** The `cd` line that opens every next-steps hint, when one is needed. */
|
|
27
|
+
const cdStep = (answers: InitAnswers): string[] =>
|
|
28
|
+
answers.directory === "." ? [] : [`cd ${answers.directory}`];
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Install the scaffolded project's dependencies. Interactive runs hide the
|
|
32
|
+
* package manager's output behind a spinner; `--yes`/CI runs stream it. On
|
|
33
|
+
* failure the scaffold is left intact and the exact retry command is printed
|
|
34
|
+
* before exiting non-zero, so a CI wrapper can tell the two outcomes apart.
|
|
35
|
+
*/
|
|
36
|
+
const installScaffold = async (
|
|
37
|
+
root: string,
|
|
38
|
+
answers: InitAnswers,
|
|
39
|
+
interactive: boolean
|
|
40
|
+
): Promise<void> => {
|
|
41
|
+
const command = commandsFor(answers.packageManager).install;
|
|
42
|
+
const spinner = interactive ? clack.spinner() : undefined;
|
|
43
|
+
if (spinner) {
|
|
44
|
+
spinner.start(`Installing dependencies (${command})`);
|
|
45
|
+
} else {
|
|
46
|
+
logger.info(`Installing dependencies (${command})…`);
|
|
47
|
+
}
|
|
48
|
+
const outcome = await installDependencies(root, answers.packageManager, {
|
|
49
|
+
quiet: interactive,
|
|
50
|
+
});
|
|
51
|
+
if (outcome.failure === undefined) {
|
|
52
|
+
if (spinner) {
|
|
53
|
+
spinner.stop("Installed dependencies");
|
|
54
|
+
} else {
|
|
55
|
+
logger.success("Installed dependencies");
|
|
56
|
+
}
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const retry = [...cdStep(answers), command];
|
|
60
|
+
const hint = `Project created successfully, but dependency installation failed.\n\nRetry with:\n\n ${retry.join("\n ")}\n`;
|
|
61
|
+
if (spinner) {
|
|
62
|
+
spinner.stop("Dependency installation failed");
|
|
63
|
+
clack.log.error(outcome.failure);
|
|
64
|
+
clack.note(hint.trimEnd());
|
|
65
|
+
clack.outro("Scaffolded without dependencies.");
|
|
66
|
+
} else {
|
|
67
|
+
logger.error(outcome.failure);
|
|
68
|
+
logger.box(hint.trimEnd());
|
|
69
|
+
}
|
|
70
|
+
process.exit(1);
|
|
71
|
+
};
|
|
72
|
+
|
|
23
73
|
/**
|
|
24
74
|
* Eject the freshly scaffolded project, or print the install-then-eject path.
|
|
25
75
|
* Eject jiti-loads the scaffolded blume.config.ts, whose `import { defineConfig }
|
|
26
76
|
* from "blume"` only resolves once dependencies are installed (or blume is
|
|
27
|
-
* hoisted from an ancestor node_modules, as in a monorepo) — so
|
|
28
|
-
*
|
|
77
|
+
* hoisted from an ancestor node_modules, as in a monorepo) — so the fallback
|
|
78
|
+
* below is the common path when the install step was skipped.
|
|
29
79
|
*/
|
|
30
80
|
const ejectScaffold = async (
|
|
31
81
|
root: string,
|
|
32
|
-
answers: InitAnswers
|
|
82
|
+
answers: InitAnswers,
|
|
83
|
+
needsInstall: boolean
|
|
33
84
|
): Promise<void> => {
|
|
34
85
|
const commands = commandsFor(answers.packageManager);
|
|
35
|
-
const cd = answers
|
|
86
|
+
const cd = cdStep(answers);
|
|
87
|
+
const install = needsInstall ? [commands.install] : [];
|
|
36
88
|
try {
|
|
37
|
-
await eject(root);
|
|
89
|
+
const { dependencies } = await eject(root);
|
|
38
90
|
// The scaffolded scripts point at the Blume CLI; the ejected app runs
|
|
39
91
|
// Astro directly (mirroring the standalone `blume eject` command).
|
|
40
|
-
await updatePackageScripts(root);
|
|
92
|
+
const added = await updatePackageScripts(root, dependencies);
|
|
41
93
|
logger.success("Ejected to a standalone Astro project.");
|
|
42
|
-
|
|
43
|
-
|
|
94
|
+
// The packages eject added aren't installed yet, even when the scaffold's
|
|
95
|
+
// own install already ran, so install comes first either way.
|
|
96
|
+
const ejectInstall = added.length > 0 ? [commands.install] : install;
|
|
97
|
+
const steps = [...cd, ...ejectInstall, commands.dev];
|
|
98
|
+
logger.box(`Next steps:\n\n ${steps.join("\n ")}`);
|
|
44
99
|
} catch (error) {
|
|
45
100
|
// SAFETY: eject and the script rewrite throw Error instances; only the
|
|
46
101
|
// message is surfaced in the fallback hint.
|
|
47
102
|
logger.warn(
|
|
48
103
|
`Scaffolded, but eject needs the project's dependencies installed to load blume.config.ts: ${(error as Error).message}`
|
|
49
104
|
);
|
|
50
|
-
const steps = [
|
|
51
|
-
|
|
52
|
-
commands.install,
|
|
53
|
-
`${commands.exec} blume eject --yes`,
|
|
54
|
-
];
|
|
55
|
-
logger.box(`Next steps:\n\n ${steps.join("\n ")}\n`);
|
|
105
|
+
const steps = [...cd, ...install, `${commands.exec} blume eject --yes`];
|
|
106
|
+
logger.box(`Next steps:\n\n ${steps.join("\n ")}`);
|
|
56
107
|
}
|
|
57
108
|
};
|
|
58
109
|
|
|
110
|
+
/**
|
|
111
|
+
* Print the closing next steps. An existing package.json was left alone, so
|
|
112
|
+
* the steps add what it lacks; a workspace `note` already printed ahead of an
|
|
113
|
+
* install that ran, so it closes the steps only when the install is still the
|
|
114
|
+
* user's to run.
|
|
115
|
+
*/
|
|
116
|
+
const printNextSteps = async (
|
|
117
|
+
root: string,
|
|
118
|
+
answers: InitAnswers,
|
|
119
|
+
outcome: {
|
|
120
|
+
createdPackage: boolean;
|
|
121
|
+
interactive: boolean;
|
|
122
|
+
needsInstall: boolean;
|
|
123
|
+
note: string | undefined;
|
|
124
|
+
}
|
|
125
|
+
): Promise<void> => {
|
|
126
|
+
const existing = outcome.createdPackage
|
|
127
|
+
? undefined
|
|
128
|
+
: await readExistingPackage(root);
|
|
129
|
+
const steps = nextSteps(
|
|
130
|
+
answers,
|
|
131
|
+
outcome.needsInstall,
|
|
132
|
+
existing,
|
|
133
|
+
outcome.needsInstall ? outcome.note : undefined
|
|
134
|
+
);
|
|
135
|
+
if (outcome.interactive) {
|
|
136
|
+
clack.note(steps.trimEnd());
|
|
137
|
+
clack.outro("You're all set.");
|
|
138
|
+
} else {
|
|
139
|
+
// consola's box pads its content itself; a trailing newline would add
|
|
140
|
+
// blank rows at the bottom.
|
|
141
|
+
logger.box(steps.trimEnd());
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Validate the enum-valued flags up front, exiting with the accepted values
|
|
147
|
+
* on a typo so a bad flag never reaches the prompts.
|
|
148
|
+
*/
|
|
149
|
+
const resolveFlags = (args: {
|
|
150
|
+
"package-manager"?: string;
|
|
151
|
+
template?: string;
|
|
152
|
+
}) => {
|
|
153
|
+
const template = TEMPLATES.find((candidate) => candidate === args.template);
|
|
154
|
+
if (args.template !== undefined && template === undefined) {
|
|
155
|
+
logger.error(
|
|
156
|
+
`Unknown template "${args.template}" (use ${TEMPLATES.join(" | ")}).`
|
|
157
|
+
);
|
|
158
|
+
process.exit(1);
|
|
159
|
+
}
|
|
160
|
+
const pm = PACKAGE_MANAGERS.find(
|
|
161
|
+
(candidate) => candidate === args["package-manager"]
|
|
162
|
+
);
|
|
163
|
+
if (args["package-manager"] !== undefined && pm === undefined) {
|
|
164
|
+
logger.error(
|
|
165
|
+
`Unknown package manager "${args["package-manager"]}" (use ${PACKAGE_MANAGERS.join(" | ")}).`
|
|
166
|
+
);
|
|
167
|
+
process.exit(1);
|
|
168
|
+
}
|
|
169
|
+
return { pm, template };
|
|
170
|
+
};
|
|
171
|
+
|
|
59
172
|
export const initCommand = defineCommand({
|
|
60
173
|
args: {
|
|
61
174
|
"content-dir": {
|
|
@@ -71,9 +184,15 @@ export const initCommand = defineCommand({
|
|
|
71
184
|
description: "Eject to a standalone Astro project after scaffolding.",
|
|
72
185
|
type: "boolean",
|
|
73
186
|
},
|
|
187
|
+
install: {
|
|
188
|
+
default: true,
|
|
189
|
+
description: "Install dependencies after scaffolding.",
|
|
190
|
+
negativeDescription: "Skip installing dependencies after scaffolding.",
|
|
191
|
+
type: "boolean",
|
|
192
|
+
},
|
|
74
193
|
"package-manager": {
|
|
75
194
|
description:
|
|
76
|
-
"Package manager
|
|
195
|
+
"Package manager to install with and print in the next steps (npm|pnpm|yarn|bun).",
|
|
77
196
|
type: "string",
|
|
78
197
|
},
|
|
79
198
|
template: {
|
|
@@ -88,23 +207,7 @@ export const initCommand = defineCommand({
|
|
|
88
207
|
meta: commandMeta.init,
|
|
89
208
|
async run({ args }) {
|
|
90
209
|
const cwd = process.cwd();
|
|
91
|
-
|
|
92
|
-
const template = TEMPLATES.find((candidate) => candidate === args.template);
|
|
93
|
-
if (args.template !== undefined && template === undefined) {
|
|
94
|
-
logger.error(
|
|
95
|
-
`Unknown template "${args.template}" (use ${TEMPLATES.join(" | ")}).`
|
|
96
|
-
);
|
|
97
|
-
process.exit(1);
|
|
98
|
-
}
|
|
99
|
-
const pm = PACKAGE_MANAGERS.find(
|
|
100
|
-
(candidate) => candidate === args["package-manager"]
|
|
101
|
-
);
|
|
102
|
-
if (args["package-manager"] !== undefined && pm === undefined) {
|
|
103
|
-
logger.error(
|
|
104
|
-
`Unknown package manager "${args["package-manager"]}" (use ${PACKAGE_MANAGERS.join(" | ")}).`
|
|
105
|
-
);
|
|
106
|
-
process.exit(1);
|
|
107
|
-
}
|
|
210
|
+
const { pm, template } = resolveFlags(args);
|
|
108
211
|
|
|
109
212
|
const interactive =
|
|
110
213
|
!args.yes &&
|
|
@@ -153,7 +256,14 @@ export const initCommand = defineCommand({
|
|
|
153
256
|
}
|
|
154
257
|
|
|
155
258
|
const sink = interactive ? clack.log : logger;
|
|
156
|
-
const
|
|
259
|
+
const env = { userAgent: process.env.npm_config_user_agent };
|
|
260
|
+
const { createdPackage } = await applyPlan(
|
|
261
|
+
buildPlan(root, answers, env),
|
|
262
|
+
sink
|
|
263
|
+
);
|
|
264
|
+
// A workspace the project joins keeps its own package-manager config,
|
|
265
|
+
// which `init` leaves alone; say what it still needs before installing.
|
|
266
|
+
const note = workspaceNote(root, answers, env);
|
|
157
267
|
|
|
158
268
|
// Keep installed dependencies, Blume's generated runtime (`.blume/`), and
|
|
159
269
|
// build output (`dist/`) out of version control. Idempotent: creates
|
|
@@ -168,17 +278,27 @@ export const initCommand = defineCommand({
|
|
|
168
278
|
sink.success(`Added ${ignored.join(", ")} to .gitignore`);
|
|
169
279
|
}
|
|
170
280
|
|
|
281
|
+
// A newly written package.json is the only one `init` knows lists blume;
|
|
282
|
+
// an existing one is left alone, and so are its dependencies.
|
|
283
|
+
const shouldInstall = createdPackage && args.install;
|
|
284
|
+
if (note) {
|
|
285
|
+
(interactive ? clack.log : logger).warn(note);
|
|
286
|
+
}
|
|
287
|
+
if (shouldInstall) {
|
|
288
|
+
await installScaffold(root, answers, interactive);
|
|
289
|
+
}
|
|
290
|
+
const needsInstall = createdPackage && !shouldInstall;
|
|
291
|
+
|
|
171
292
|
if (args.eject) {
|
|
172
|
-
await ejectScaffold(root, answers);
|
|
293
|
+
await ejectScaffold(root, answers, needsInstall);
|
|
173
294
|
return;
|
|
174
295
|
}
|
|
175
296
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
}
|
|
297
|
+
await printNextSteps(root, answers, {
|
|
298
|
+
createdPackage,
|
|
299
|
+
interactive,
|
|
300
|
+
needsInstall,
|
|
301
|
+
note,
|
|
302
|
+
});
|
|
183
303
|
},
|
|
184
304
|
});
|
|
@@ -0,0 +1,121 @@
|
|
|
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 { packageRoot } from "../../core/package-root.ts";
|
|
7
|
+
import { getBlumeVersion } from "../../core/version.ts";
|
|
8
|
+
import {
|
|
9
|
+
MIGRATE_SKILL_DIR,
|
|
10
|
+
MIGRATE_SOURCES,
|
|
11
|
+
MIGRATE_SOURCE_NAMES,
|
|
12
|
+
detectMigrateSource,
|
|
13
|
+
isMigrateSource,
|
|
14
|
+
migratePrompt,
|
|
15
|
+
} from "../../migrate/migrate.ts";
|
|
16
|
+
import type { MigrateSourceId } from "../../migrate/migrate.ts";
|
|
17
|
+
import { commandMeta } from "../command-meta.ts";
|
|
18
|
+
import { reportInternalError } from "../internal-error.ts";
|
|
19
|
+
import { logger } from "../log.ts";
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* `blume migrate [source]` — move a docs site from another framework to Blume
|
|
23
|
+
* with a coding agent. Run it through the package runner (`npx blume migrate
|
|
24
|
+
* fumadocs --claude`) in the site being migrated: it names the source (or
|
|
25
|
+
* detects it), then opens Claude Code or Codex on the `blume-migrate` skill
|
|
26
|
+
* bundled in this package, the way `blume audit --claude` hands off its
|
|
27
|
+
* findings. The judgment stays in the skill; the command is the front door.
|
|
28
|
+
* Status lines go straight to stderr: consola drops info-level lines in test
|
|
29
|
+
* and CI environments.
|
|
30
|
+
*/
|
|
31
|
+
export const migrateCommand = defineCommand({
|
|
32
|
+
args: {
|
|
33
|
+
claude: {
|
|
34
|
+
description: "Run the migration with Claude Code.",
|
|
35
|
+
type: "boolean",
|
|
36
|
+
},
|
|
37
|
+
codex: {
|
|
38
|
+
description: "Run the migration with Codex.",
|
|
39
|
+
type: "boolean",
|
|
40
|
+
},
|
|
41
|
+
source: {
|
|
42
|
+
description: `The framework to migrate from: ${MIGRATE_SOURCES.join(" | ")}. Detected when omitted.`,
|
|
43
|
+
required: false,
|
|
44
|
+
type: "positional",
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
meta: commandMeta.migrate,
|
|
48
|
+
async run({ args }) {
|
|
49
|
+
const root = process.cwd();
|
|
50
|
+
// SAFETY: AGENTS is a closed record keyed by AgentKind, so its keys are
|
|
51
|
+
// exactly the agent kinds.
|
|
52
|
+
const agents = (Object.keys(AGENTS) as AgentKind[]).filter(
|
|
53
|
+
(kind) => args[kind]
|
|
54
|
+
);
|
|
55
|
+
if (agents.length > 1) {
|
|
56
|
+
logger.error("Pass at most one of --codex or --claude.");
|
|
57
|
+
process.exit(1);
|
|
58
|
+
}
|
|
59
|
+
const [agent] = agents;
|
|
60
|
+
if (args.source && !isMigrateSource(args.source)) {
|
|
61
|
+
logger.error(
|
|
62
|
+
`Unknown source "${args.source}" (use ${MIGRATE_SOURCES.join(" | ")}). Leave it out to detect the framework, or to migrate from one not listed.`
|
|
63
|
+
);
|
|
64
|
+
process.exit(1);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
try {
|
|
68
|
+
const detected = await detectMigrateSource(root);
|
|
69
|
+
const named: MigrateSourceId | null =
|
|
70
|
+
args.source && isMigrateSource(args.source) ? args.source : null;
|
|
71
|
+
const source = named ?? detected?.source ?? null;
|
|
72
|
+
process.stderr.write(
|
|
73
|
+
source
|
|
74
|
+
? ` Migrating from ${MIGRATE_SOURCE_NAMES[source]}${named ? "" : ` (detected from ${detected?.evidence})`}.\n`
|
|
75
|
+
: " Couldn't detect the docs framework; the agent will inventory the repo first.\n"
|
|
76
|
+
);
|
|
77
|
+
// A named source wins, but a repo that looks like another framework is
|
|
78
|
+
// worth a second look before an agent rewrites it on the wrong mappings.
|
|
79
|
+
if (named && detected && detected.source !== named) {
|
|
80
|
+
process.stderr.write(
|
|
81
|
+
` Warning: this looks like a ${MIGRATE_SOURCE_NAMES[detected.source]} project (${detected.evidence}); migrating from ${MIGRATE_SOURCE_NAMES[named]} as named.\n`
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
const skillDir = join(packageRoot(), MIGRATE_SKILL_DIR);
|
|
85
|
+
|
|
86
|
+
// Without an agent flag the command is the pointer for any other agent:
|
|
87
|
+
// the bundled skill's path (which lives in a throwaway cache under npx),
|
|
88
|
+
// plus the install line that puts the skill where agents look for it.
|
|
89
|
+
if (!agent) {
|
|
90
|
+
process.stderr.write(
|
|
91
|
+
` blume migrate runs the migration with a coding agent: rerun with --codex or --claude.\n Using another agent? Point it at ${join(skillDir, "SKILL.md")},\n or install the skill where your agent looks for skills: npx skills add haydenbleasel/blume --skill blume-migrate\n`
|
|
92
|
+
);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const cli = AGENTS[agent];
|
|
97
|
+
process.stderr.write(` Handing the migration to ${cli.name}…\n\n`);
|
|
98
|
+
const code = await launchInstalledAgent(
|
|
99
|
+
cli.bin,
|
|
100
|
+
migratePrompt({
|
|
101
|
+
detected,
|
|
102
|
+
skillDir,
|
|
103
|
+
source,
|
|
104
|
+
version: getBlumeVersion(),
|
|
105
|
+
})
|
|
106
|
+
);
|
|
107
|
+
if (code === null) {
|
|
108
|
+
logger.error(
|
|
109
|
+
`${cli.name} (\`${cli.bin}\`) was not found on PATH. Install it with \`${cli.install}\`.`
|
|
110
|
+
);
|
|
111
|
+
process.exit(1);
|
|
112
|
+
}
|
|
113
|
+
if (code !== 0) {
|
|
114
|
+
process.exit(code);
|
|
115
|
+
}
|
|
116
|
+
} catch (error) {
|
|
117
|
+
reportInternalError(error);
|
|
118
|
+
process.exit(1);
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
});
|