Skip to content

chore: update Astro and adapters - #3105

Open
ascorbic wants to merge 17 commits into
mainfrom
codex/astro-7-3-adapters
Open

chore: update Astro and adapters#3105
ascorbic wants to merge 17 commits into
mainfrom
codex/astro-7-3-adapters

Conversation

@ascorbic

@ascorbic ascorbic commented Sep 14, 2026

Copy link
Copy Markdown
Collaborator

What does this PR do?

Updates every workspace Astro consumer to Astro 7.3.2 and the latest stable Cloudflare, Node, and React integrations. It also updates the docs site to Starlight 0.42.0 and the WordPress theme scaffold to the same Astro generation.

Astro 7.3 removed the app pipeline property used by scheduled cache invalidation, so the Cloudflare worker now resolves the configured cache provider from the public app manifest and keeps it cached per isolate. The regression test verifies that scheduled publishing still invalidates collection and entry tags.

@emdash-cms/cloudflare now requires stable Astro 6.0.0 or later; Astro 6 prereleases are no longer supported. Packages that compile or test against Astro use the workspace catalog as an explicit dev dependency, so the repository tests Astro 7.3 without forcing that version on stable Astro 6 consumers.

The Wrangler and Workers types catalogs accept compatible releases from 4.125.0 and 5.20260820.1 onward. The lockfile uses those adapter-compatible versions so this PR does not also introduce a later workerd/Miniflare runtime update.

Closes # N/A

Type of change

  • Bug fix
  • Feature (requires maintainer-approved Discussion)
  • Refactor (no behavior change)
  • Translation
  • Documentation
  • Performance improvement
  • Tests
  • Chore (dependencies, CI, tooling)

Checklist

  • I have read CONTRIBUTING.md
  • pnpm typecheck passes
  • pnpm lint passes
  • pnpm test passes (or targeted tests for my change)
  • pnpm format has been run
  • I have added/updated tests for my changes (if applicable)
  • User-visible strings in the admin UI are wrapped for translation (if applicable). Do not include messages.po changes except in translation PRs — a workflow extracts catalogs on merge to main.
  • I have added and reviewed the user-facing changeset (if this PR changes a published package)
  • New features link to an approved Discussion: https://github.com/emdash-cms/emdash/discussions/...
  • I have included screenshots below if this PR changes the UI

The i18n, Discussion, and screenshot items are not applicable: this changes no admin UI strings, adds no feature, and changes no rendered interface.

AI-generated code disclosure

  • This PR includes AI-generated code — model/tool: GPT-5 Codex

Screenshots / test output

Not applicable; there is no UI change.

Validated with:

  • pnpm install --frozen-lockfile
  • pnpm build
  • pnpm typecheck
  • pnpm typecheck:demos
  • pnpm typecheck:templates
  • pnpm lint
  • pnpm format:check
  • pnpm --dir docs build
  • Node and Cloudflare demo production builds
  • Cloudflare package tests (435 passed, 2 skipped)
  • Packed isolated-install smoke matrix (6 passed)

@changeset-bot

changeset-bot Bot commented Sep 14, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 71a8080

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 12 packages
Name Type
@emdash-cms/cloudflare Minor
emdash Minor
@emdash-cms/plugin-test Patch
@emdash-cms/sandbox-workerd Patch
@emdash-cms/admin Minor
@emdash-cms/auth Minor
@emdash-cms/blocks Minor
create-emdash Minor
@emdash-cms/gutenberg-to-portable-text Minor
@emdash-cms/x402 Minor
@emdash-cms/auth-atproto Patch
@emdash-cms/plugin-embeds Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@cloudflare-workers-and-pages

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Updated (UTC)
✅ Deployment successful!
View logs
docs c77cc16 Sep 14 2026, 11:00 AM

@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Sep 14, 2026

Copy link
Copy Markdown

🚀 Deploying Preview to Cloudflare 🚀

Preview URL: https://codex-astro-7-3-adapters.try.emdashcms.com, https://codex-astro-7-3-adapters-emdash-playground.emdash-cms.workers.dev (commit 1a8f7f8)

This URL reflects your latest Preview deployment

Preview Deployments by commit

Status Deployment URL Commit Updated (UTC) See this deployment's details
  • Build: Success ✅
  • Deployment: Success ✅

View logs ↗
https://92131baa.try.emdashcms.com, https://92131baa-emdash-playground.emdash-cms.workers.dev 1a8f7f8 2026-09-14T17:48:30.373Z Visit the dashboard ↗
  • Build: Success ✅
  • Deployment: Success ✅

View logs ↗
https://027fdd83.try.emdashcms.com, https://027fdd83-emdash-playground.emdash-cms.workers.dev 998b03f 2026-09-14T17:16:16.500Z Visit the dashboard ↗
  • Build: Success ✅
  • Deployment: Success ✅

View logs ↗
https://66bff142.try.emdashcms.com, https://66bff142-emdash-playground.emdash-cms.workers.dev 48f17a1 2026-09-14T16:17:04.800Z Visit the dashboard ↗
  • Build: Success ✅
  • Deployment: Success ✅

View logs ↗
https://921de1f9.try.emdashcms.com, https://921de1f9-emdash-playground.emdash-cms.workers.dev c34074d 2026-09-14T14:57:40.774Z Visit the dashboard ↗
  • Build: Success ✅
  • Deployment: Success ✅

View logs ↗
https://68ce93c5.try.emdashcms.com, https://68ce93c5-emdash-playground.emdash-cms.workers.dev 994a209 2026-09-14T13:11:47.322Z Visit the dashboard ↗
  • Build: Success ✅
  • Deployment: Success ✅

View logs ↗
https://8eb637cc.try.emdashcms.com, https://8eb637cc-emdash-playground.emdash-cms.workers.dev 849a2c0 2026-09-14T12:25:29.363Z Visit the dashboard ↗
  • Build: Success ✅
  • Deployment: Success ✅

View logs ↗
https://b87fba65.try.emdashcms.com, https://b87fba65-emdash-playground.emdash-cms.workers.dev 648a6d9 2026-09-14T11:42:38.812Z Visit the dashboard ↗
  • Build: In progress 🔵

View logs ↗
ad30fe3 2026-09-14T11:36:56.864Z View logs ↗
  • Build: Success ✅
  • Deployment: Success ✅

View logs ↗
https://5cfdabe2.try.emdashcms.com, https://5cfdabe2-emdash-playground.emdash-cms.workers.dev d3b5194 2026-09-14T11:33:33.454Z Visit the dashboard ↗
  • Build: Success ✅
  • Deployment: Success ✅

View logs ↗
https://61e3ee5a.try.emdashcms.com, https://61e3ee5a-emdash-playground.emdash-cms.workers.dev 7a5fbe1 2026-09-14T11:22:48.342Z Visit the dashboard ↗

View all previews: View all previews ↗

@pkg-pr-new

pkg-pr-new Bot commented Sep 14, 2026

Copy link
Copy Markdown

Open in StackBlitz

@emdash-cms/admin

npm i https://pkg.pr.new/@emdash-cms/admin@3105

@emdash-cms/auth

npm i https://pkg.pr.new/@emdash-cms/auth@3105

@emdash-cms/auth-atproto

npm i https://pkg.pr.new/@emdash-cms/auth-atproto@3105

@emdash-cms/blocks

npm i https://pkg.pr.new/@emdash-cms/blocks@3105

@emdash-cms/cloudflare

npm i https://pkg.pr.new/@emdash-cms/cloudflare@3105

@emdash-cms/contentful-to-portable-text

npm i https://pkg.pr.new/@emdash-cms/contentful-to-portable-text@3105

emdash

npm i https://pkg.pr.new/emdash@3105

create-emdash

npm i https://pkg.pr.new/create-emdash@3105

@emdash-cms/gutenberg-to-portable-text

npm i https://pkg.pr.new/@emdash-cms/gutenberg-to-portable-text@3105

@emdash-cms/plugin-cli

npm i https://pkg.pr.new/@emdash-cms/plugin-cli@3105

@emdash-cms/plugin-test

npm i https://pkg.pr.new/@emdash-cms/plugin-test@3105

@emdash-cms/plugin-types

npm i https://pkg.pr.new/@emdash-cms/plugin-types@3105

@emdash-cms/registry-client

npm i https://pkg.pr.new/@emdash-cms/registry-client@3105

@emdash-cms/registry-lexicons

npm i https://pkg.pr.new/@emdash-cms/registry-lexicons@3105

@emdash-cms/registry-moderation

npm i https://pkg.pr.new/@emdash-cms/registry-moderation@3105

@emdash-cms/registry-verification

npm i https://pkg.pr.new/@emdash-cms/registry-verification@3105

@emdash-cms/sandbox-workerd

npm i https://pkg.pr.new/@emdash-cms/sandbox-workerd@3105

@emdash-cms/x402

npm i https://pkg.pr.new/@emdash-cms/x402@3105

@emdash-cms/plugin-ai-moderation

npm i https://pkg.pr.new/@emdash-cms/plugin-ai-moderation@3105

@emdash-cms/plugin-atproto

npm i https://pkg.pr.new/@emdash-cms/plugin-atproto@3105

@emdash-cms/plugin-audit-log

npm i https://pkg.pr.new/@emdash-cms/plugin-audit-log@3105

@emdash-cms/plugin-color

npm i https://pkg.pr.new/@emdash-cms/plugin-color@3105

@emdash-cms/plugin-embeds

npm i https://pkg.pr.new/@emdash-cms/plugin-embeds@3105

@emdash-cms/plugin-field-kit

npm i https://pkg.pr.new/@emdash-cms/plugin-field-kit@3105

@emdash-cms/plugin-forms

npm i https://pkg.pr.new/@emdash-cms/plugin-forms@3105

@emdash-cms/plugin-webhook-notifier

npm i https://pkg.pr.new/@emdash-cms/plugin-webhook-notifier@3105

commit: 71a8080

@github-actions

Copy link
Copy Markdown
Contributor

Scope check

This PR changes 4,251 lines across 9 files. Large PRs are harder to review and more likely to be closed without review.

If this scope is intentional, no action needed. A maintainer will review it. If not, please consider splitting this into smaller PRs.

See CONTRIBUTING.md for contribution guidelines.

@emdashbot emdashbot Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approach is sound: Astro 7.3 removed app.pipeline.getCacheProvider, so resolving the configured cache provider from app.manifest.cacheProvider is the correct migration for the Cloudflare scheduled() handler. Caching the provider per isolate and invalidating tags incrementally after each batch matches the existing design and the PR's stated regression target. The changeset is concise and user-facing.

I found two blocking-ish contract/convention issues and one coverage suggestion:

  1. Peer dependency mismatch@emdash-cms/cloudflare still declares "astro": ">=6.0.0-beta.0", but the new worker code calls app.manifest.cacheProvider?.(), an Astro 7.3-era API. Consumers on Astro 6 will silently no-op cache invalidation without this range being narrowed.
  2. Module-scope singleton – the new cacheProvider (and the existing app) are plain module-level variables, which violates AGENTS.md's globalThis + Symbol.for singleton discipline for duplicated SSR/worker chunks. This also makes tests that want alternate provider states unreliable.
  3. No-op coverage – the new regression test covers the invalidation path, but the documented "no-op when no cache provider is configured" path is no longer exercised after the mock was changed to always return a provider.

The dependency and docs-only changes are otherwise consistent with a routine Astro 7.3/Starlight 0.42 upgrade.


Findings

  • [needs fixing] packages/cloudflare/package.json:126

    The package now calls app.manifest.cacheProvider in src/worker.ts, which is an Astro 7.3 API, but peerDependencies.astro still allows Astro 6 beta and up. A consumer on Astro 6 will load the worker successfully (the optional chain won't throw), but scheduled cache invalidation will silently no-op because the provider is never resolved.

    Narrow the peer range to the Astro generation the code actually requires:

    		"astro": ">=7.3.0",
    

    (Use >=7.3.2 if the manifest surface shipped in that patch.) While here, consider whether @astrojs/cloudflare >=12.0.0 is still compatible with the adapter version this code is built against.

  • [needs fixing] packages/cloudflare/src/worker.ts:22-23

    The new isolate-level cache-provider cache is a plain module-scope variable. AGENTS.md requires module-scope singletons to live on globalThis behind a Symbol.for key, because Vite/Rollup can duplicate modules across worker/SSR chunks and produce two independent let variables.

    Replace both app and cacheProvider with globalThis-backed helpers:

    const APP_KEY = Symbol.for("@emdash-cms/cloudflare:app");
    const CACHE_PROVIDER_KEY = Symbol.for("@emdash-cms/cloudflare:cache-provider");
    const g = globalThis as Record<symbol, unknown>;
    
    function getApp() {
    	const existing = g[APP_KEY] as ReturnType<typeof createApp> | undefined;
    	if (existing) return existing;
    	const app = createApp();
    	g[APP_KEY] = app;
    	return app;
    }
    
    async function loadCacheProvider() {
    	const app = getApp();
    	const module = await app.manifest.cacheProvider?.();
    	return module?.default?.(app.manifest.cacheConfig?.options) ?? null;
    }
    
    function getCacheProvider() {
    	const existing = g[CACHE_PROVIDER_KEY] as ReturnType<typeof loadCacheProvider> | undefined;
    	if (existing) return existing;
    	const provider = loadCacheProvider();
    	g[CACHE_PROVIDER_KEY] = provider;
    	return provider;
    }
    

    Then in invalidatePublishedTags call const provider = await getCacheProvider(); instead of cacheProvider ??= loadCacheProvider();.

  • [suggestion] packages/cloudflare/tests/worker-scheduled.test.ts:58

    The new regression test covers cache invalidation, but the docstring/code path "A no-op when no cache provider is configured" is no longer exercised after the mock was changed to always return a provider.

    Add a sibling test that verifies the handler does not throw and does not call cache.invalidate when manifest.cacheProvider is absent. Because the production singleton is lazy, this will likely need vi.resetModules() in beforeEach (or a test-only reset helper) to keep different provider states from leaking between tests.

@github-actions github-actions Bot added review/awaiting-author Reviewed; waiting on the author to respond and removed review/needs-review No maintainer or bot review yet labels Sep 14, 2026
@github-actions github-actions Bot added review/needs-rereview Author pushed changes since the last review area/core area/plugins and removed review/awaiting-author Reviewed; waiting on the author to respond labels Sep 14, 2026
@ascorbic ascorbic added the bot:review Trigger an emdashbot code review on this PR label Sep 14, 2026

@emdashbot emdashbot Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The approach is still sound: moving scheduled cache invalidation from the removed app.pipeline.getCacheProvider to app.manifest.cacheProvider and caching the resolved provider per isolate is the right migration for Astro 7.3. The author addressed the two concrete blockers from the prior review: the app and cacheProvider singletons now live on globalThis behind Symbol.for keys, and a regression test covers the no-op path.

Two issues remain. First, the Astro version contract is internally inconsistent: the changeset says “Astro 7.3 sites”, the PR description claims the app.manifest.cacheProvider surface is present in Astro 6.0.0 and 6.4.8, and the peer dependency range still allows Astro 6 beta. Either narrow the range or update the public docs to reflect supported versions. Second, getCacheProvider caches the loading promise before it resolves, so a transient failure in provider resolution becomes a permanent cache-invalidation outage for that worker isolate. Without node_modules, I cannot verify the Astro 6 claim directly; treat it as unverified rather than confirmed.

I reviewed the diff, the changed worker and test files, the changeset, the Cloudflare package manifest, and the docs llms.txt.ts/Astro config changes against AGENTS.md conventions.

Comment thread .changeset/astro-scheduled-cache.md Outdated
Comment thread packages/cloudflare/src/worker.ts
@emdashbot emdashbot Bot removed the bot:review Trigger an emdashbot code review on this PR label Sep 14, 2026
@github-actions github-actions Bot added review/awaiting-author Reviewed; waiting on the author to respond and removed review/needs-rereview Author pushed changes since the last review labels Sep 14, 2026
@ascorbic ascorbic added the bot:review Trigger an emdashbot code review on this PR label Sep 14, 2026
@ascorbic

Copy link
Copy Markdown
Collaborator Author

Addressed the current-head findings in 7a5fbe12e:

  • rejected cache-provider loads now evict the singleton promise so the next scheduled run retries; the new regression fails before the fix and passes after it;
  • the changeset is version-neutral;
  • the broad workspace Astro overrides were replaced with explicit catalog dev dependencies, preserving published peer ranges.

I kept Astro 6 support after checking the published astro@6.0.0 and astro@6.4.8 tarballs directly. In both versions, BaseApp publicly exposes manifest, and SSRManifest contains cacheProvider?: () => Promise<{ default: CacheProviderFactory | null }> plus cacheConfig?: SSRManifestCache. Those are the exact fields used by the new code.

~ 🤖 Codex

@github-actions github-actions Bot added review/needs-rereview Author pushed changes since the last review and removed review/awaiting-author Reviewed; waiting on the author to respond labels Sep 14, 2026

@emdashbot emdashbot Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a re-review of the Astro 7.3 adapter upgrade. The approach is still sound: moving scheduled cache invalidation off the removed app.pipeline.getCacheProvider and onto app.manifest.cacheProvider while caching the resolved provider per isolate is the right migration.

The two concrete blockers from the prior review are now addressed:

  • app and cacheProvider live on globalThis behind privately-namespaced Symbol.for keys, so module duplication under Vite doesn't create multiple singletons.
  • A regression test covers the no-op path (no cache provider configured), and another test verifies that a transient provider-loading failure evicts the cached promise so the next scheduled tick retries.

I re-read the changed worker and tests, the Cloudflare package manifest, the changeset, and the docs config/page changes. The implementation is clean and the tests verify observable behavior rather than implementation details.

One item from the prior review is still open: the Astro version contract. The worker now reads app.manifest.cacheProvider, which the PR description asserts is present in Astro 6.0.0 and 6.4.8, but the @emdash-cms/cloudflare peer dependency still allows astro >=6.0.0-beta.0. That range includes prereleases the PR does not claim support for. Without node_modules I cannot verify the Astro 6 claim directly, but the mismatch between the allowed range and the claimed supported versions is a real contract risk: consumers on a 6.0.0 beta/rc could see scheduled cache invalidation throw. Narrowing the peer range (or providing docs that explicitly list the minimum supported Astro version) remains the right fix.

If that range is tightened, this is an LGTM.


Findings

  • [needs fixing] packages/cloudflare/package.json:126

    The scheduled() handler now depends on app.manifest.cacheProvider (see packages/cloudflare/src/worker.ts). The PR description says that surface is present in Astro 6.0.0 and 6.4.8, but this peer range still allows >=6.0.0-beta.0 — prereleases not covered by that claim. If those versions lack app.manifest.cacheProvider, scheduled publishing cache invalidation will throw at runtime for consumers on a beta/rc. Tighten the range to a version that is known to expose the cache-provider manifest surface.

        "astro": ">=6.0.0",
    

    (If verification shows the surface only shipped in a later 6.x, use that as the lower bound instead.)

@emdashbot emdashbot Bot removed the bot:review Trigger an emdashbot code review on this PR label Sep 14, 2026
@emdashbot emdashbot Bot removed the bot:review Trigger an emdashbot code review on this PR label Sep 14, 2026
@github-actions github-actions Bot added review/approved Approved; no new commits since and removed review/needs-rereview Author pushed changes since the last review labels Sep 14, 2026
@ascorbic ascorbic added the bot:review Trigger an emdashbot code review on this PR label Sep 14, 2026
@github-actions github-actions Bot added review/needs-rereview Author pushed changes since the last review and removed review/approved Approved; no new commits since labels Sep 14, 2026

@emdashbot emdashbot Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a re-review of the Astro 7.3 / adapters upgrade. The approach is still sound: resolving the cache provider from the Astro manifest and caching it per isolate is the right replacement for the removed app.pipeline.getCacheProvider, and the scheduled-handler tests cover the success, absent-provider, and retry paths.

I re-read the changed source, package manifests, the changeset, and the docs route. Two issues surfaced that the previous pass missed:

  1. The changeset only lists @emdash-cms/cloudflare, but packages/core/src/astro/integration/vite-config.ts (shipped via the emdash package's ./astro export) received Astro 7.3-specific optimizer/pre-bundle changes. Because emdash and @emdash-cms/cloudflare are in the same fixed group in .changeset/config.json, the cloudflare entry will drive emdash's version bump without describing the core integration changes. A separate core changeset is needed.

  2. docs/src/pages/llms.txt.ts assumes config.title is a locale map. The docs config uses a plain string title (title: "EmDash"), so unless Starlight normalizes it to an object at runtime the rendered heading becomes # E. The code should handle a string title explicitly.

Everything else looks consistent: peer/dev dependency ranges match the PR description, the worker singletons follow the globalThis + Symbol.for rule, and the test infrastructure cleanly centralizes Vitest env stripping.

@@ -0,0 +1,11 @@
---
"@emdash-cms/cloudflare": minor

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[needs fixing] The frontmatter only covers @emdash-cms/cloudflare, but this PR also changes packages/core/src/astro/integration/vite-config.ts — code shipped through the emdash package's ./astro export. The new optimizer entries, shim aliases, and Astro 7.3 logger handling are observable to emdash consumers and need their own release note. Because the packages are in the same fixed group in .changeset/config.json, the cloudflare entry will bump emdash without describing the core integration changes. Add a separate changeset for emdash describing the Astro 7.3 dev/build compatibility fixes, or restructure the prose so both packages are accurately represented.

For example, add a second file:

Suggested change
"@emdash-cms/cloudflare": minor
---
"emdash": patch
---
Updates the EmDash Astro integration's Vite optimizer configuration for Astro 7.3 compatibility, including pre-bundled entries for new Astro internal modules and the `use-sync-external-store` shim aliases.

Comment thread docs/src/pages/llms.txt.ts Outdated
@@ -18,10 +19,7 @@ export const GET: APIRoute = async ({ site }) => {

const lang = config.defaultLocale.lang;
const title = (lang ? config.title[lang] : undefined) ?? Object.values(config.title)[0] ?? "";

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[suggestion] docs/astro.config.mjs uses a plain string title: "EmDash", but this line treats config.title as a locale map and falls back to Object.values(config.title)[0]. If Starlight does not normalize a string title into an object at runtime, the fallback will produce the first character (# E). Handle the string case explicitly:

Suggested change
const title = (lang ? config.title[lang] : undefined) ?? Object.values(config.title)[0] ?? "";
const title =
typeof config.title === "string"
? config.title
: (lang ? config.title[lang] : undefined) ?? Object.values(config.title)[0] ?? "";

@emdashbot emdashbot Bot removed the bot:review Trigger an emdashbot code review on this PR label Sep 14, 2026
@github-actions github-actions Bot added review/approved Approved; no new commits since and removed review/needs-rereview Author pushed changes since the last review labels Sep 14, 2026
@ascorbic ascorbic added the bot:review Trigger an emdashbot code review on this PR label Sep 14, 2026
@github-actions github-actions Bot added review/needs-rereview Author pushed changes since the last review and removed review/approved Approved; no new commits since labels Sep 14, 2026

@emdashbot emdashbot Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-review: Astro 7.3 / adapters upgrade

The approach is still sound: resolving the cache provider from the Astro app manifest and caching the resulting provider per-isolate is the right replacement for the removed app.pipeline.getCacheProvider, and the worker scheduled tests cover the success, absent-provider, and retry paths.

Both findings from the previous review are addressed:

  1. Core changeset added. .changeset/cold-cloudflare-dev.md now covers the emdash package (which ships packages/core/src/astro/integration/vite-config.ts via the ./astro export). Its description focuses on the user-visible outcome—Cloudflare-backed Astro dev servers no longer hang during initial setup/first admin request—rather than listing internal optimizer entries. That's the right shape for a patch changeset.
  2. docs/src/pages/llms.txt.ts now handles string titles. The typeof config.title === "string" branch correctly deals with Starlight configs that use a plain string title, and the tagline is preserved in the generated llms.txt without relying on config.tagline.

I re-read the changed source, package manifests, the two changesets, the docs route, and the test infrastructure. The new consumerEnvironment helper cleanly centralizes Vitest env stripping, the worker singletons follow the globalThis + Symbol.for rule, the explicit astro/@astrojs/react dev dependencies line up with the PR's goal of testing against the catalog version without forcing it on consumers, and the peer dependency narrowing for @emdash-cms/cloudflare is documented with migration guidance.

No new blockers or regressions surfaced.

@emdashbot emdashbot Bot removed the bot:review Trigger an emdashbot code review on this PR label Sep 14, 2026
@github-actions github-actions Bot added review/approved Approved; no new commits since and removed review/needs-rereview Author pushed changes since the last review labels Sep 14, 2026
@github-actions github-actions Bot added review/needs-rereview Author pushed changes since the last review and removed review/approved Approved; no new commits since labels Sep 14, 2026
@ascorbic ascorbic added the bot:review Trigger an emdashbot code review on this PR label Sep 14, 2026

@emdashbot emdashbot Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-review of the Astro 7.3 / adapters upgrade. The approach remains the right one: Astro 7.3 removed app.pipeline.getCacheProvider, so resolving the configured cache provider from the public app manifest and caching the resulting provider per-isolate via globalThis + Symbol.for is the idiomatic replacement and follows the repository’s singleton discipline.

Both findings from the previous review are addressed:

  • .changeset/cold-cloudflare-dev.md now covers the emdash package (the dev-hang fix lives in packages/core/src/astro/integration/vite-config.ts) and focuses on the user-visible outcome.
  • docs/src/pages/llms.txt.ts now safely handles string config.title values and keeps the tagline in llms.txt via a hardcoded constant.

I re-read the changed source, updated package manifests, the two new changesets, the docs route, and the test infrastructure. The new consumerEnvironment helper cleanly centralises Vitest env stripping, the worker singletons follow the required globalThis pattern, the explicit astro/@astrojs/react dev dependencies line up with the goal of testing against the catalog version without forcing it on consumers, and the @emdash-cms/cloudflare peer narrowing is documented with migration guidance. The regression tests cover scheduled cache invalidation success, absent-provider, and retry paths.

No new logic bugs, security issues, AGENTS.md violations, missing locale filters, or logged-out query regressions surfaced. The changesets are user-facing and proportional to the changes. I’m happy to approve.

@emdashbot emdashbot Bot removed the bot:review Trigger an emdashbot code review on this PR label Sep 14, 2026

@emdashbot emdashbot Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-review after my previous APPROVED review. The two prior findings are addressed:

  • .changeset/cold-cloudflare-dev.md now targets the emdash package and describes the user-facing dev-server hang fix.
  • docs/src/pages/llms.txt.ts now safely handles a plain-string config.title and emits the tagline from a hardcoded constant.

I re-read the changed source, updated manifests, the two new changesets, the docs route, the test infrastructure, and the lockfile snapshots. The Astro 7.3 migration path remains sound: resolving the configured cache provider from the public Astro app manifest and caching the app/provider singletons on globalThis via Symbol.for follows the repository’s isolate-singleton discipline, and the regression tests cover success, absent-provider, and retry paths. The consumerEnvironment helper is a clean centralization for spawning Astro subprocesses without the Vitest env vars that trigger background detaching.

No new logic bugs, security issues, AGENTS.md convention violations, missing locale filters, logged-out query regressions, or test-quality problems surfaced. The changesets are user-facing, proportional, and include migration guidance for the peer-dependency narrowing. Approving.

@emdashbot emdashbot Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a coherent, well-scoped dependency chore. The Astro 7.3 upgrade is handled at the right layer of abstraction: the Cloudflare Worker cache-invalidation path adapts to Astro 7.3's removal of app.pipeline.getCacheProvider() by resolving the provider from the public app manifest and caching the app/provider singletons on globalThis, and the Vite configuration is updated to pre-bundle the lazy-loaded AT Protocol / auth modules that Astro 7's dependency scanner misses. The approach fits EmDash's isolate-singleton and explicit-catalog-versioning patterns.

I re-checked the whole diff, the previous review's two findings, and the AGENTS.md conventions:

  • .changeset/cold-cloudflare-dev.md now targets the published emdash and @emdash-cms/cloudflare packages and describes the dev-server hang fix in user-facing terms.
  • docs/src/pages/llms.txt.ts now safely handles a plain-string config.title and emits the tagline from a hardcoded TAGLINE constant.
  • The new consumerEnvironment helper is a clean, centralized way to strip VITEST* env vars from Astro child processes so astro dev does not detach under Vitest.
  • The added worker-scheduled.test.ts cases cover the success, absent-provider, and retry paths for scheduled cache invalidation.
  • No logged-out hot-path queries were added; docs/src/pages/llms.txt.ts is build-time prerendered and the Worker scheduled handler is not a request path.
  • No Lingui / RTL / SQL / API-envelope / locale-filter issues are introduced.
  • The changesets are proportional, lead with observable behavior, and the minor changeset includes a clear migration note for the Astro 6 prerelease peer-dependency narrowing.

I did not run tooling; this is static analysis only. The author reports full build, typecheck, lint, format, demo, and smoke validation. No logic bugs, regressions, security issues, AGENTS.md violations, or missing test coverage surfaced on this pass.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant