From 8406cb1a13d678f822695be3bfd8d2c3ace2b772 Mon Sep 17 00:00:00 2001 From: "Houston (Bot)" <108291165+astrobot-houston@users.noreply.github.com> Date: Wed, 11 Feb 2026 13:28:39 -0800 Subject: [PATCH 1/4] [ci] release (beta) (#15458) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/pre.json | 9 +++ examples/basics/package.json | 2 +- examples/blog/package.json | 4 +- examples/component/package.json | 2 +- examples/container-with-vitest/package.json | 2 +- examples/framework-alpine/package.json | 2 +- examples/framework-multiple/package.json | 2 +- examples/framework-preact/package.json | 2 +- examples/framework-react/package.json | 2 +- examples/framework-solid/package.json | 2 +- examples/framework-svelte/package.json | 2 +- examples/framework-vue/package.json | 2 +- examples/hackernews/package.json | 4 +- examples/integration/package.json | 2 +- examples/minimal/package.json | 2 +- examples/portfolio/package.json | 2 +- examples/ssr/package.json | 4 +- examples/starlog/package.json | 2 +- examples/toolbar-app/package.json | 2 +- examples/with-markdoc/package.json | 2 +- examples/with-mdx/package.json | 4 +- examples/with-nanostores/package.json | 2 +- examples/with-tailwindcss/package.json | 4 +- examples/with-vitest/package.json | 2 +- packages/astro/CHANGELOG.md | 42 ++++++++++++++ packages/astro/package.json | 2 +- packages/integrations/cloudflare/CHANGELOG.md | 13 +++++ packages/integrations/cloudflare/package.json | 2 +- packages/integrations/mdx/CHANGELOG.md | 6 ++ packages/integrations/mdx/package.json | 2 +- packages/integrations/netlify/CHANGELOG.md | 11 ++++ packages/integrations/netlify/package.json | 2 +- packages/integrations/node/CHANGELOG.md | 6 ++ packages/integrations/node/package.json | 2 +- packages/integrations/vercel/CHANGELOG.md | 8 +++ packages/integrations/vercel/package.json | 2 +- pnpm-lock.yaml | 56 +++++++++---------- 37 files changed, 157 insertions(+), 62 deletions(-) diff --git a/.changeset/pre.json b/.changeset/pre.json index 4668d4b60d52..b0b4907d559e 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -60,6 +60,7 @@ "busy-actors-follow", "busy-humans-smoke", "busy-olives-chew", + "calm-birds-fly", "clear-areas-cry", "clever-clubs-listen", "cloudflare-dev-styles", @@ -67,11 +68,13 @@ "cloudflare-integration-wrangler", "cloudflare-workerd-prerender", "common-knives-rescue", + "common-signs-punch", "cuddly-worlds-beam", "custom-prerenderer-api", "cyan-crews-cross", "dance-ornate-keen", "deep-states-talk", + "discover-ssr-deps", "drop-cjs-config-support", "dry-balloons-brush", "dry-icons-nail", @@ -87,15 +90,18 @@ "famous-trees-tan", "fancy-bananas-sing", "fast-bushes-fall", + "fifty-dingos-study", "fix-create-astro-registry-hang", "fix-mdx-slot-hydration", "fix-preact-cloudflare-hooks", "fix-rewrite-non-ascii-paths", "fix-serve-files-outside-srcdir", + "fix-store-race-condition", "fix-vite-runner-closed", "flat-lions-care", "flat-symbols-arrive", "floppy-bottles-notice", + "fluffy-pets-greet", "fluffy-shrimps-drop", "four-insects-tan", "fresh-rocks-sing", @@ -137,11 +143,13 @@ "moody-owls-refuse", "new-areas-yawn", "new-beans-obey", + "nice-clouds-pull", "old-donuts-visit", "open-days-watch", "open-monkeys-boil", "optional-wrangler-config", "pretty-forks-smash", + "proud-pans-change", "public-files-priority", "public-lemons-mate", "puny-poems-create", @@ -177,6 +185,7 @@ "stale-ads-see", "strict-regions-drop", "strong-islands-say", + "strong-wolves-march", "sweet-buttons-jam", "swift-planets-swim", "tall-needles-cross", diff --git a/examples/basics/package.json b/examples/basics/package.json index 9dec31d48b03..d3d0fe62e1ed 100644 --- a/examples/basics/package.json +++ b/examples/basics/package.json @@ -13,6 +13,6 @@ "astro": "astro" }, "dependencies": { - "astro": "^6.0.0-beta.10" + "astro": "^6.0.0-beta.11" } } diff --git a/examples/blog/package.json b/examples/blog/package.json index f0a1d45aa2c9..0b78ebe10970 100644 --- a/examples/blog/package.json +++ b/examples/blog/package.json @@ -13,10 +13,10 @@ "astro": "astro" }, "dependencies": { - "@astrojs/mdx": "^5.0.0-beta.6", + "@astrojs/mdx": "^5.0.0-beta.7", "@astrojs/rss": "^4.0.15-beta.3", "@astrojs/sitemap": "^3.6.1-beta.3", - "astro": "^6.0.0-beta.10", + "astro": "^6.0.0-beta.11", "sharp": "^0.34.3" } } diff --git a/examples/component/package.json b/examples/component/package.json index f2b4e8377db6..b4daaaac1fde 100644 --- a/examples/component/package.json +++ b/examples/component/package.json @@ -18,7 +18,7 @@ ], "scripts": {}, "devDependencies": { - "astro": "^6.0.0-beta.10" + "astro": "^6.0.0-beta.11" }, "peerDependencies": { "astro": "^5.0.0 || ^6.0.0" diff --git a/examples/container-with-vitest/package.json b/examples/container-with-vitest/package.json index 03a299860722..fa99e42ed9df 100644 --- a/examples/container-with-vitest/package.json +++ b/examples/container-with-vitest/package.json @@ -15,7 +15,7 @@ }, "dependencies": { "@astrojs/react": "^5.0.0-beta.3", - "astro": "^6.0.0-beta.10", + "astro": "^6.0.0-beta.11", "react": "^18.3.1", "react-dom": "^18.3.1", "vitest": "^3.2.4" diff --git a/examples/framework-alpine/package.json b/examples/framework-alpine/package.json index 13a0b4758b21..010815ed11eb 100644 --- a/examples/framework-alpine/package.json +++ b/examples/framework-alpine/package.json @@ -16,6 +16,6 @@ "@astrojs/alpinejs": "^0.5.0-beta.1", "@types/alpinejs": "^3.13.11", "alpinejs": "^3.15.8", - "astro": "^6.0.0-beta.10" + "astro": "^6.0.0-beta.11" } } diff --git a/examples/framework-multiple/package.json b/examples/framework-multiple/package.json index 66609ae3af7a..cbebef36d185 100644 --- a/examples/framework-multiple/package.json +++ b/examples/framework-multiple/package.json @@ -20,7 +20,7 @@ "@astrojs/vue": "^6.0.0-beta.1", "@types/react": "^18.3.28", "@types/react-dom": "^18.3.7", - "astro": "^6.0.0-beta.10", + "astro": "^6.0.0-beta.11", "preact": "^10.28.3", "react": "^18.3.1", "react-dom": "^18.3.1", diff --git a/examples/framework-preact/package.json b/examples/framework-preact/package.json index c9cf1aeea182..e5d674bf1e0b 100644 --- a/examples/framework-preact/package.json +++ b/examples/framework-preact/package.json @@ -15,7 +15,7 @@ "dependencies": { "@astrojs/preact": "^5.0.0-beta.3", "@preact/signals": "^2.7.0", - "astro": "^6.0.0-beta.10", + "astro": "^6.0.0-beta.11", "preact": "^10.28.3" } } diff --git a/examples/framework-react/package.json b/examples/framework-react/package.json index 6a65bff1b8dd..242f4b14c2fa 100644 --- a/examples/framework-react/package.json +++ b/examples/framework-react/package.json @@ -16,7 +16,7 @@ "@astrojs/react": "^5.0.0-beta.3", "@types/react": "^18.3.28", "@types/react-dom": "^18.3.7", - "astro": "^6.0.0-beta.10", + "astro": "^6.0.0-beta.11", "react": "^18.3.1", "react-dom": "^18.3.1" } diff --git a/examples/framework-solid/package.json b/examples/framework-solid/package.json index f53d305c4e64..2a05aba9f9f9 100644 --- a/examples/framework-solid/package.json +++ b/examples/framework-solid/package.json @@ -14,7 +14,7 @@ }, "dependencies": { "@astrojs/solid-js": "^6.0.0-beta.2", - "astro": "^6.0.0-beta.10", + "astro": "^6.0.0-beta.11", "solid-js": "^1.9.11" } } diff --git a/examples/framework-svelte/package.json b/examples/framework-svelte/package.json index 48841c9d303c..3c77ec33954b 100644 --- a/examples/framework-svelte/package.json +++ b/examples/framework-svelte/package.json @@ -14,7 +14,7 @@ }, "dependencies": { "@astrojs/svelte": "^8.0.0-beta.2", - "astro": "^6.0.0-beta.10", + "astro": "^6.0.0-beta.11", "svelte": "^5.49.2" } } diff --git a/examples/framework-vue/package.json b/examples/framework-vue/package.json index 3464996b63e0..01c87c9bc65d 100644 --- a/examples/framework-vue/package.json +++ b/examples/framework-vue/package.json @@ -14,7 +14,7 @@ }, "dependencies": { "@astrojs/vue": "^6.0.0-beta.1", - "astro": "^6.0.0-beta.10", + "astro": "^6.0.0-beta.11", "vue": "^3.5.27" } } diff --git a/examples/hackernews/package.json b/examples/hackernews/package.json index e0e7442969d9..01a2f0edcfe4 100644 --- a/examples/hackernews/package.json +++ b/examples/hackernews/package.json @@ -13,7 +13,7 @@ "astro": "astro" }, "dependencies": { - "@astrojs/node": "^10.0.0-beta.3", - "astro": "^6.0.0-beta.10" + "@astrojs/node": "^10.0.0-beta.4", + "astro": "^6.0.0-beta.11" } } diff --git a/examples/integration/package.json b/examples/integration/package.json index cf01c65b5fb1..1519ca026129 100644 --- a/examples/integration/package.json +++ b/examples/integration/package.json @@ -18,7 +18,7 @@ ], "scripts": {}, "devDependencies": { - "astro": "^6.0.0-beta.10" + "astro": "^6.0.0-beta.11" }, "peerDependencies": { "astro": "^4.0.0" diff --git a/examples/minimal/package.json b/examples/minimal/package.json index 8368d80b50d7..4d794d270d3c 100644 --- a/examples/minimal/package.json +++ b/examples/minimal/package.json @@ -13,6 +13,6 @@ "astro": "astro" }, "dependencies": { - "astro": "^6.0.0-beta.10" + "astro": "^6.0.0-beta.11" } } diff --git a/examples/portfolio/package.json b/examples/portfolio/package.json index 0af576089f79..de52005f672a 100644 --- a/examples/portfolio/package.json +++ b/examples/portfolio/package.json @@ -13,6 +13,6 @@ "astro": "astro" }, "dependencies": { - "astro": "^6.0.0-beta.10" + "astro": "^6.0.0-beta.11" } } diff --git a/examples/ssr/package.json b/examples/ssr/package.json index a31e9267472c..3ec889dbaae4 100644 --- a/examples/ssr/package.json +++ b/examples/ssr/package.json @@ -14,9 +14,9 @@ "server": "node dist/server/entry.mjs" }, "dependencies": { - "@astrojs/node": "^10.0.0-beta.3", + "@astrojs/node": "^10.0.0-beta.4", "@astrojs/svelte": "^8.0.0-beta.2", - "astro": "^6.0.0-beta.10", + "astro": "^6.0.0-beta.11", "svelte": "^5.49.2" } } diff --git a/examples/starlog/package.json b/examples/starlog/package.json index 0ea85537d255..52b8dd834e6c 100644 --- a/examples/starlog/package.json +++ b/examples/starlog/package.json @@ -9,7 +9,7 @@ "astro": "astro" }, "dependencies": { - "astro": "^6.0.0-beta.10", + "astro": "^6.0.0-beta.11", "sass": "^1.97.3", "sharp": "^0.34.3" }, diff --git a/examples/toolbar-app/package.json b/examples/toolbar-app/package.json index f6aef82c96f5..a22ccfa9fe85 100644 --- a/examples/toolbar-app/package.json +++ b/examples/toolbar-app/package.json @@ -16,7 +16,7 @@ }, "devDependencies": { "@types/node": "^18.17.8", - "astro": "^6.0.0-beta.10" + "astro": "^6.0.0-beta.11" }, "engines": { "node": ">=22.12.0" diff --git a/examples/with-markdoc/package.json b/examples/with-markdoc/package.json index 0c2b0129561b..9fe5dd94c404 100644 --- a/examples/with-markdoc/package.json +++ b/examples/with-markdoc/package.json @@ -14,6 +14,6 @@ }, "dependencies": { "@astrojs/markdoc": "^1.0.0-beta.9", - "astro": "^6.0.0-beta.10" + "astro": "^6.0.0-beta.11" } } diff --git a/examples/with-mdx/package.json b/examples/with-mdx/package.json index 991b817193c0..1feaffe0f6fe 100644 --- a/examples/with-mdx/package.json +++ b/examples/with-mdx/package.json @@ -13,9 +13,9 @@ "astro": "astro" }, "dependencies": { - "@astrojs/mdx": "^5.0.0-beta.6", + "@astrojs/mdx": "^5.0.0-beta.7", "@astrojs/preact": "^5.0.0-beta.3", - "astro": "^6.0.0-beta.10", + "astro": "^6.0.0-beta.11", "preact": "^10.28.3" } } diff --git a/examples/with-nanostores/package.json b/examples/with-nanostores/package.json index e72df8505565..d0a7b8bf492a 100644 --- a/examples/with-nanostores/package.json +++ b/examples/with-nanostores/package.json @@ -15,7 +15,7 @@ "dependencies": { "@astrojs/preact": "^5.0.0-beta.3", "@nanostores/preact": "^1.0.0", - "astro": "^6.0.0-beta.10", + "astro": "^6.0.0-beta.11", "nanostores": "^1.1.0", "preact": "^10.28.3" } diff --git a/examples/with-tailwindcss/package.json b/examples/with-tailwindcss/package.json index 4209bf32b0f2..8591a85fdbcf 100644 --- a/examples/with-tailwindcss/package.json +++ b/examples/with-tailwindcss/package.json @@ -13,10 +13,10 @@ "astro": "astro" }, "dependencies": { - "@astrojs/mdx": "^5.0.0-beta.6", + "@astrojs/mdx": "^5.0.0-beta.7", "@tailwindcss/vite": "^4.1.18", "@types/canvas-confetti": "^1.9.0", - "astro": "^6.0.0-beta.10", + "astro": "^6.0.0-beta.11", "canvas-confetti": "^1.9.4", "tailwindcss": "^4.1.18" } diff --git a/examples/with-vitest/package.json b/examples/with-vitest/package.json index 06ab4edecb2c..a0febc1c1b23 100644 --- a/examples/with-vitest/package.json +++ b/examples/with-vitest/package.json @@ -14,7 +14,7 @@ "test": "vitest" }, "dependencies": { - "astro": "^6.0.0-beta.10", + "astro": "^6.0.0-beta.11", "vitest": "^3.2.4" } } diff --git a/packages/astro/CHANGELOG.md b/packages/astro/CHANGELOG.md index 50db8dacc526..9da463098440 100644 --- a/packages/astro/CHANGELOG.md +++ b/packages/astro/CHANGELOG.md @@ -1,5 +1,47 @@ # astro +## 6.0.0-beta.11 + +### Major Changes + +- [#15180](https://github.com/withastro/astro/pull/15180) [`8780ff2`](https://github.com/withastro/astro/commit/8780ff2926d59ed196c70032d2ae274b8415655c) Thanks [@Princesseuh](https://github.com/Princesseuh)! - Adds support for converting SVGs to raster images (PNGs, WebP, etc) to the default Sharp image service - ([v6 upgrade guidance](https://v6.docs.astro.build/en/guides/upgrade-to/v6/#changed-svg-rasterization)) + +### Minor Changes + +- [#15460](https://github.com/withastro/astro/pull/15460) [`ee7e53f`](https://github.com/withastro/astro/commit/ee7e53f9de2338517e149895efd26fca44ad80b6) Thanks [@florian-lefebvre](https://github.com/florian-lefebvre)! - Updates the Adapter API to allow providing a `serverEntrypoint` when using `entryType: 'self'` + + Astro 6 introduced a new powerful yet simple Adapter API for defining custom server entrypoints. You can now call `setAdapter()` with the `entryType: 'self'` option and specify your custom `serverEntrypoint`: + + ```js + export function myAdapter() { + return { + name: 'my-adapter', + hooks: { + 'astro:config:done': ({ setAdapter }) => { + setAdapter({ + name: 'my-adapter', + entryType: 'self', + serverEntrypoint: 'my-adapter/server.js', + supportedAstroFeatures: { + // ... + }, + }); + }, + }, + }; + } + ``` + + If you need further customization at the Vite level, you can omit `serverEntrypoint` and instead specify your custom server entrypoint with [`vite.build.rollupOptions.input`](https://rollupjs.org/configuration-options/#input). + +### Patch Changes + +- [#15454](https://github.com/withastro/astro/pull/15454) [`b47a4e1`](https://github.com/withastro/astro/commit/b47a4e19a0b0b7e57068add94adc01c88d380fa8) Thanks [@Fryuni](https://github.com/Fryuni)! - Fixes a race condition in the content layer which could result in dropped content collection entries. + +- [#15450](https://github.com/withastro/astro/pull/15450) [`50c9129`](https://github.com/withastro/astro/commit/50c912978cca4afbe4b3ebd11c30305d5e9c8315) Thanks [@florian-lefebvre](https://github.com/florian-lefebvre)! - Fixes a case where `build.serverEntry` would not be respected when using the new Adapter API + +- [#15473](https://github.com/withastro/astro/pull/15473) [`d653b86`](https://github.com/withastro/astro/commit/d653b864252e0b39a3774f0e1ecf4b7b69851288) Thanks [@matthewp](https://github.com/matthewp)! - Improves Host header handling for SSR deployments behind proxies + ## 6.0.0-beta.10 ### Minor Changes diff --git a/packages/astro/package.json b/packages/astro/package.json index 587d2a5d5ed0..f4ae18f1ee60 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -1,6 +1,6 @@ { "name": "astro", - "version": "6.0.0-beta.10", + "version": "6.0.0-beta.11", "description": "Astro is a modern site builder with web best practices, performance, and DX front-of-mind.", "type": "module", "author": "withastro", diff --git a/packages/integrations/cloudflare/CHANGELOG.md b/packages/integrations/cloudflare/CHANGELOG.md index 40263c9c5d58..7e2a645eb55c 100644 --- a/packages/integrations/cloudflare/CHANGELOG.md +++ b/packages/integrations/cloudflare/CHANGELOG.md @@ -1,5 +1,18 @@ # @astrojs/cloudflare +## 13.0.0-beta.7 + +### Patch Changes + +- [#15452](https://github.com/withastro/astro/pull/15452) [`e1aa3f3`](https://github.com/withastro/astro/commit/e1aa3f31d6d83435c138b355b79add674691fa5f) Thanks [@matthewp](https://github.com/matthewp)! - Fixes server-side dependencies not being discovered ahead of time during development + + Previously, imports in `.astro` file frontmatter were not scanned by Vite's dependency optimizer, causing a "new dependencies optimized" message and page reload when the dependency was first encountered. Astro is now able to scan these dependencies ahead of time. + +- [#15450](https://github.com/withastro/astro/pull/15450) [`50c9129`](https://github.com/withastro/astro/commit/50c912978cca4afbe4b3ebd11c30305d5e9c8315) Thanks [@florian-lefebvre](https://github.com/florian-lefebvre)! - Fixes a case where `build.serverEntry` would not be respected when using the new Adapter API + +- Updated dependencies []: + - @astrojs/underscore-redirects@1.0.0 + ## 13.0.0-beta.6 ### Major Changes diff --git a/packages/integrations/cloudflare/package.json b/packages/integrations/cloudflare/package.json index 6dba9a2f2abe..6b8881d00427 100644 --- a/packages/integrations/cloudflare/package.json +++ b/packages/integrations/cloudflare/package.json @@ -1,7 +1,7 @@ { "name": "@astrojs/cloudflare", "description": "Deploy your site to Cloudflare Workers/Pages", - "version": "13.0.0-beta.6", + "version": "13.0.0-beta.7", "type": "module", "types": "./dist/index.d.ts", "author": "withastro", diff --git a/packages/integrations/mdx/CHANGELOG.md b/packages/integrations/mdx/CHANGELOG.md index 214e498bde73..45a6469ddb73 100644 --- a/packages/integrations/mdx/CHANGELOG.md +++ b/packages/integrations/mdx/CHANGELOG.md @@ -1,5 +1,11 @@ # @astrojs/mdx +## 5.0.0-beta.7 + +### Patch Changes + +- [#15475](https://github.com/withastro/astro/pull/15475) [`36fc0e0`](https://github.com/withastro/astro/commit/36fc0e0c9e75b4cf830b15afd1a6a1f769095e6f) Thanks [@delucis](https://github.com/delucis)! - Fixes edge cases where an `export const components = {...}` declaration would fail to be detected with the `optimize` option enabled + ## 5.0.0-beta.6 ### Patch Changes diff --git a/packages/integrations/mdx/package.json b/packages/integrations/mdx/package.json index 4fcb791f19ae..4f4c834a142a 100644 --- a/packages/integrations/mdx/package.json +++ b/packages/integrations/mdx/package.json @@ -1,7 +1,7 @@ { "name": "@astrojs/mdx", "description": "Add support for MDX pages in your Astro site", - "version": "5.0.0-beta.6", + "version": "5.0.0-beta.7", "type": "module", "types": "./dist/index.d.ts", "author": "withastro", diff --git a/packages/integrations/netlify/CHANGELOG.md b/packages/integrations/netlify/CHANGELOG.md index c29be0f82722..76b53a096ea1 100644 --- a/packages/integrations/netlify/CHANGELOG.md +++ b/packages/integrations/netlify/CHANGELOG.md @@ -1,5 +1,16 @@ # @astrojs/netlify +## 7.0.0-beta.9 + +### Patch Changes + +- [#15460](https://github.com/withastro/astro/pull/15460) [`ee7e53f`](https://github.com/withastro/astro/commit/ee7e53f9de2338517e149895efd26fca44ad80b6) Thanks [@florian-lefebvre](https://github.com/florian-lefebvre)! - Updates to use the new Adapter API + +- [#15450](https://github.com/withastro/astro/pull/15450) [`50c9129`](https://github.com/withastro/astro/commit/50c912978cca4afbe4b3ebd11c30305d5e9c8315) Thanks [@florian-lefebvre](https://github.com/florian-lefebvre)! - Fixes a case where `build.serverEntry` would not be respected when using the new Adapter API + +- Updated dependencies []: + - @astrojs/underscore-redirects@1.0.0 + ## 7.0.0-beta.8 ### Minor Changes diff --git a/packages/integrations/netlify/package.json b/packages/integrations/netlify/package.json index 9ad84d1dbd91..f744739c5bab 100644 --- a/packages/integrations/netlify/package.json +++ b/packages/integrations/netlify/package.json @@ -1,7 +1,7 @@ { "name": "@astrojs/netlify", "description": "Deploy your site to Netlify", - "version": "7.0.0-beta.8", + "version": "7.0.0-beta.9", "type": "module", "types": "./dist/index.d.ts", "author": "withastro", diff --git a/packages/integrations/node/CHANGELOG.md b/packages/integrations/node/CHANGELOG.md index 87b3f9843f5a..79d250756482 100644 --- a/packages/integrations/node/CHANGELOG.md +++ b/packages/integrations/node/CHANGELOG.md @@ -1,5 +1,11 @@ # @astrojs/node +## 10.0.0-beta.4 + +### Patch Changes + +- [#15473](https://github.com/withastro/astro/pull/15473) [`d653b86`](https://github.com/withastro/astro/commit/d653b864252e0b39a3774f0e1ecf4b7b69851288) Thanks [@matthewp](https://github.com/matthewp)! - Improves error page loading to read from disk first before falling back to configured host + ## 10.0.0-beta.3 ### Patch Changes diff --git a/packages/integrations/node/package.json b/packages/integrations/node/package.json index d268e79e836c..2217d532cc7a 100644 --- a/packages/integrations/node/package.json +++ b/packages/integrations/node/package.json @@ -1,7 +1,7 @@ { "name": "@astrojs/node", "description": "Deploy your site to a Node.js server", - "version": "10.0.0-beta.3", + "version": "10.0.0-beta.4", "type": "module", "types": "./dist/index.d.ts", "author": "withastro", diff --git a/packages/integrations/vercel/CHANGELOG.md b/packages/integrations/vercel/CHANGELOG.md index 9271425f8eb6..7ff3b2aab439 100644 --- a/packages/integrations/vercel/CHANGELOG.md +++ b/packages/integrations/vercel/CHANGELOG.md @@ -1,5 +1,13 @@ # @astrojs/vercel +## 10.0.0-beta.4 + +### Patch Changes + +- [#15460](https://github.com/withastro/astro/pull/15460) [`ee7e53f`](https://github.com/withastro/astro/commit/ee7e53f9de2338517e149895efd26fca44ad80b6) Thanks [@florian-lefebvre](https://github.com/florian-lefebvre)! - Updates to use the new Adapter API + +- [#15450](https://github.com/withastro/astro/pull/15450) [`50c9129`](https://github.com/withastro/astro/commit/50c912978cca4afbe4b3ebd11c30305d5e9c8315) Thanks [@florian-lefebvre](https://github.com/florian-lefebvre)! - Fixes a case where `build.serverEntry` would not be respected when using the new Adapter API + ## 10.0.0-beta.3 ### Major Changes diff --git a/packages/integrations/vercel/package.json b/packages/integrations/vercel/package.json index 2b5bd7e390a2..d5c25834bd54 100644 --- a/packages/integrations/vercel/package.json +++ b/packages/integrations/vercel/package.json @@ -1,7 +1,7 @@ { "name": "@astrojs/vercel", "description": "Deploy your site to Vercel", - "version": "10.0.0-beta.3", + "version": "10.0.0-beta.4", "type": "module", "author": "withastro", "license": "MIT", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 99e0ffcae0a2..fc16207bc693 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -172,13 +172,13 @@ importers: examples/basics: dependencies: astro: - specifier: ^6.0.0-beta.10 + specifier: ^6.0.0-beta.11 version: link:../../packages/astro examples/blog: dependencies: '@astrojs/mdx': - specifier: ^5.0.0-beta.6 + specifier: ^5.0.0-beta.7 version: link:../../packages/integrations/mdx '@astrojs/rss': specifier: ^4.0.15-beta.3 @@ -187,7 +187,7 @@ importers: specifier: ^3.6.1-beta.3 version: link:../../packages/integrations/sitemap astro: - specifier: ^6.0.0-beta.10 + specifier: ^6.0.0-beta.11 version: link:../../packages/astro sharp: specifier: ^0.34.3 @@ -196,7 +196,7 @@ importers: examples/component: devDependencies: astro: - specifier: ^6.0.0-beta.10 + specifier: ^6.0.0-beta.11 version: link:../../packages/astro examples/container-with-vitest: @@ -205,7 +205,7 @@ importers: specifier: ^5.0.0-beta.3 version: link:../../packages/integrations/react astro: - specifier: ^6.0.0-beta.10 + specifier: ^6.0.0-beta.11 version: link:../../packages/astro react: specifier: ^18.3.1 @@ -236,7 +236,7 @@ importers: specifier: ^3.15.8 version: 3.15.8 astro: - specifier: ^6.0.0-beta.10 + specifier: ^6.0.0-beta.11 version: link:../../packages/astro examples/framework-multiple: @@ -263,7 +263,7 @@ importers: specifier: ^18.3.7 version: 18.3.7(@types/react@18.3.28) astro: - specifier: ^6.0.0-beta.10 + specifier: ^6.0.0-beta.11 version: link:../../packages/astro preact: specifier: ^10.28.3 @@ -293,7 +293,7 @@ importers: specifier: ^2.7.0 version: 2.7.0(preact@10.28.3) astro: - specifier: ^6.0.0-beta.10 + specifier: ^6.0.0-beta.11 version: link:../../packages/astro preact: specifier: ^10.28.3 @@ -311,7 +311,7 @@ importers: specifier: ^18.3.7 version: 18.3.7(@types/react@18.3.28) astro: - specifier: ^6.0.0-beta.10 + specifier: ^6.0.0-beta.11 version: link:../../packages/astro react: specifier: ^18.3.1 @@ -326,7 +326,7 @@ importers: specifier: ^6.0.0-beta.2 version: link:../../packages/integrations/solid astro: - specifier: ^6.0.0-beta.10 + specifier: ^6.0.0-beta.11 version: link:../../packages/astro solid-js: specifier: ^1.9.11 @@ -338,7 +338,7 @@ importers: specifier: ^8.0.0-beta.2 version: link:../../packages/integrations/svelte astro: - specifier: ^6.0.0-beta.10 + specifier: ^6.0.0-beta.11 version: link:../../packages/astro svelte: specifier: ^5.49.2 @@ -350,7 +350,7 @@ importers: specifier: ^6.0.0-beta.1 version: link:../../packages/integrations/vue astro: - specifier: ^6.0.0-beta.10 + specifier: ^6.0.0-beta.11 version: link:../../packages/astro vue: specifier: ^3.5.27 @@ -359,40 +359,40 @@ importers: examples/hackernews: dependencies: '@astrojs/node': - specifier: ^10.0.0-beta.3 + specifier: ^10.0.0-beta.4 version: link:../../packages/integrations/node astro: - specifier: ^6.0.0-beta.10 + specifier: ^6.0.0-beta.11 version: link:../../packages/astro examples/integration: devDependencies: astro: - specifier: ^6.0.0-beta.10 + specifier: ^6.0.0-beta.11 version: link:../../packages/astro examples/minimal: dependencies: astro: - specifier: ^6.0.0-beta.10 + specifier: ^6.0.0-beta.11 version: link:../../packages/astro examples/portfolio: dependencies: astro: - specifier: ^6.0.0-beta.10 + specifier: ^6.0.0-beta.11 version: link:../../packages/astro examples/ssr: dependencies: '@astrojs/node': - specifier: ^10.0.0-beta.3 + specifier: ^10.0.0-beta.4 version: link:../../packages/integrations/node '@astrojs/svelte': specifier: ^8.0.0-beta.2 version: link:../../packages/integrations/svelte astro: - specifier: ^6.0.0-beta.10 + specifier: ^6.0.0-beta.11 version: link:../../packages/astro svelte: specifier: ^5.49.2 @@ -401,7 +401,7 @@ importers: examples/starlog: dependencies: astro: - specifier: ^6.0.0-beta.10 + specifier: ^6.0.0-beta.11 version: link:../../packages/astro sass: specifier: ^1.97.3 @@ -416,7 +416,7 @@ importers: specifier: ^18.17.8 version: 18.19.130 astro: - specifier: ^6.0.0-beta.10 + specifier: ^6.0.0-beta.11 version: link:../../packages/astro examples/with-markdoc: @@ -425,19 +425,19 @@ importers: specifier: ^1.0.0-beta.9 version: link:../../packages/integrations/markdoc astro: - specifier: ^6.0.0-beta.10 + specifier: ^6.0.0-beta.11 version: link:../../packages/astro examples/with-mdx: dependencies: '@astrojs/mdx': - specifier: ^5.0.0-beta.6 + specifier: ^5.0.0-beta.7 version: link:../../packages/integrations/mdx '@astrojs/preact': specifier: ^5.0.0-beta.3 version: link:../../packages/integrations/preact astro: - specifier: ^6.0.0-beta.10 + specifier: ^6.0.0-beta.11 version: link:../../packages/astro preact: specifier: ^10.28.3 @@ -452,7 +452,7 @@ importers: specifier: ^1.0.0 version: 1.0.0(nanostores@1.1.0)(preact@10.28.3) astro: - specifier: ^6.0.0-beta.10 + specifier: ^6.0.0-beta.11 version: link:../../packages/astro nanostores: specifier: ^1.1.0 @@ -464,7 +464,7 @@ importers: examples/with-tailwindcss: dependencies: '@astrojs/mdx': - specifier: ^5.0.0-beta.6 + specifier: ^5.0.0-beta.7 version: link:../../packages/integrations/mdx '@tailwindcss/vite': specifier: ^4.1.18 @@ -473,7 +473,7 @@ importers: specifier: ^1.9.0 version: 1.9.0 astro: - specifier: ^6.0.0-beta.10 + specifier: ^6.0.0-beta.11 version: link:../../packages/astro canvas-confetti: specifier: ^1.9.4 @@ -485,7 +485,7 @@ importers: examples/with-vitest: dependencies: astro: - specifier: ^6.0.0-beta.10 + specifier: ^6.0.0-beta.11 version: link:../../packages/astro vitest: specifier: ^3.2.4 From d9aa8a5484db8b0b1bf304bffdccff216436ff0a Mon Sep 17 00:00:00 2001 From: "Fred K. Schott" <622227+FredKSchott@users.noreply.github.com> Date: Wed, 11 Feb 2026 15:19:10 -0800 Subject: [PATCH 2/4] Experiment: Automatic triage for new GitHub issues (#15476) * add triage workflow, skills * update workflow * update workflow * update @flue/cli and @flue/client to latest * update @flue/cli and @flue/client to latest * add logging for git push * add back issue template * add back issue template * limit flue triage to issues created after 2026-02-11 * add better support for skipped reproductions * update workflow * update model * update skills * update skills * update skills * update agents.md * update agents.md * update agents.md * fix bad commit * updates * updates * update agents.md * update @flue/cli to 0.0.17 and @flue/client to 0.0.9 * use build scripts correctly * use anthropic/claude-opus-4 model identifier * update workflow * update workflow * update workflow --------- Co-authored-by: Fred K. Schott --- .agents/skills/triage/SKILL.md | 46 +++++++++ .agents/skills/triage/comment.md | 74 +++++++++++++++ .agents/skills/triage/diagnose.md | 90 ++++++++++++++++++ .agents/skills/triage/fix.md | 126 +++++++++++++++++++++++++ .agents/skills/triage/reproduce.md | 125 ++++++++++++++++++++++++ .flue/workflows/issue-triage.ts | 146 +++++++++++++++++++++++++++++ .github/workflows/issue-triage.yml | 84 +++++++++++++++++ .gitignore | 1 + AGENTS.md | 74 +++++++++++++++ knip.js | 3 +- package.json | 5 +- pnpm-lock.yaml | 56 +++++++++++ pnpm-workspace.yaml | 1 + turbo.json | 2 + 14 files changed, 831 insertions(+), 2 deletions(-) create mode 100644 .agents/skills/triage/SKILL.md create mode 100644 .agents/skills/triage/comment.md create mode 100644 .agents/skills/triage/diagnose.md create mode 100644 .agents/skills/triage/fix.md create mode 100644 .agents/skills/triage/reproduce.md create mode 100644 .flue/workflows/issue-triage.ts create mode 100644 .github/workflows/issue-triage.yml create mode 100644 AGENTS.md diff --git a/.agents/skills/triage/SKILL.md b/.agents/skills/triage/SKILL.md new file mode 100644 index 000000000000..d012ce6877d9 --- /dev/null +++ b/.agents/skills/triage/SKILL.md @@ -0,0 +1,46 @@ +--- +name: triage +description: Triage a bug report. Reproduces the bug, diagnoses the root cause, and attempts a fix. Use when asked to "triage issue #1234", "triage this bug", or similar. +--- + +# Triage + +Triage a bug report end-to-end: reproduce the bug, diagnose the root cause, and attempt a fix. + +## Input + +You need either: + +- `issueTitle` and `issueBody` provided in args (preferred — use these directly as the bug report), OR +- A GitHub issue number or URL mentioned in the conversation (use `gh issue view` to fetch details) + +If a `triageDir` is provided in args, use that as the working directory for the triage. Otherwise, default to `triage/gh-` (if you have an issue number) or `triage/current`. + +## Step 1: Reproduce + +Read and follow [reproduce.md](reproduce.md). Use a subagent for this step to isolate context. + +After completing reproduction, check the result: + +- If the issue was **skipped** (host-specific, unsupported version, etc.) — skip to Output. +- If the issue was **not reproducible** — skip to Output. +- If the issue was **reproduced** — continue to Step 2. + +## Step 2: Diagnose + +Read and follow [diagnose.md](diagnose.md). Use a subagent for this step to isolate context. + +After completing diagnosis, check your confidence: + +- If confidence is **low** — skip to Output. +- If confidence is **medium** or **high** — continue to Step 3. + +## Step 3: Fix + +Read and follow [fix.md](fix.md). Use a subagent for this step to isolate context. + +Whether the fix succeeds or fails, continue to Output. + +## Output + +After completing the triage (or exiting early), you may suggest generating a GitHub comment using [comment.md](comment.md) if the user would find it useful. diff --git a/.agents/skills/triage/comment.md b/.agents/skills/triage/comment.md new file mode 100644 index 000000000000..6f9f92388d78 --- /dev/null +++ b/.agents/skills/triage/comment.md @@ -0,0 +1,74 @@ +# Comment + +Generate a GitHub issue comment from triage findings. + +**CRITICAL: You MUST always produce a GitHub comment as your final output, regardless of what input files are available. Even if `report.md` is missing or empty, you must still produce a comment. In that case, produce a minimal comment stating that automated triage could not be completed.** + +## Prerequisites + +These variables are referenced throughout this skill. They may be passed as args by an orchestrator, or inferred from the conversation when run standalone. + +- **`triageDir`** — Directory containing the reproduction project (e.g. `triage/issue-123`). If not passed as an arg, infer from previous conversation. +- **`report.md`** — File in `triageDir` that MAY exist. Contains the full context from all previous skills (reproduction, diagnosis, fix). +- **`branchName`** — The branch name where a fix was pushed. If not passed as an arg, infer from previous conversation. + +## Overview + +1. Read `report.md` from the triage directory +2. Generate a GitHub comment following the template below + +## Step 1: Read Triage Output + +Read `report.md` from the `triageDir` directory. This file is the shared context log — each previous skill (reproduce, diagnose, fix) appends its findings to it. + +If `report.md` is missing or empty, generate a minimal comment (see "Fallback" section below). + +## Step 2: Generate Comment + +Generate and return a GitHub comment following this template. Adapt it to fit the findings: + +- Include only the sections that are relevant to what was discovered +- If the issue could NOT be reproduced, omit the fix-related sections +- If no fix was developed, omit the "How to Fix" section or replace its content with a brief note explaining why +- Add or remove subsections as needed to clearly communicate findings + +Keep it concise: + +- Summary section: One sentence per bold field +- Use collapsible `
` sections for longer content +- Include exact versions, commands, and file paths where relevant + +Format requirements: + +- Code blocks: Use appropriate language hints (bash, typescript, diff, patch, etc.) +- Patches: Use ```diff for maintainer patches + +### Template + +```markdown +**[I was able to reproduce this issue. / I was unable to reproduce this issue.]** [1-2 sentences describing the result and key observations.] + +**Fix:** [If `branchName` arg is non-null, include: [Create PR](https://github.com/withastro/astro/compare/{branchName}?expand=1)] **[I was able to fix this issue. / I was unable to fix this issue.]** [1-2 sentences describing the solution and key observations. Even if no fix was created, you can still use this space to give guidance or "a best guess" at where the fix might be.] + +**Cause:** [Single sentence explaining the root cause - or just the word "Unknown" if not determined.] + +**Impact:** [Single sentence describing who is affected and how - or just the word "Unknown" if not determined.] + +
+Full Triage Report + +[Include the full contents of report.md here, formatted for readability] + +
+ +_This report was made by an LLM. Mistakes happen, check important info._ +``` + +## Optional Follow-up Task + +You MAY SUGGEST to the user, as a potential follow-up step, to post the issue to GitHub directly. However you CANNOT DO THIS STEP unless the user explicitly asks. + +```bash +gh issue comment --body +gh issue comment --body-file +``` diff --git a/.agents/skills/triage/diagnose.md b/.agents/skills/triage/diagnose.md new file mode 100644 index 000000000000..73c6de2bb75e --- /dev/null +++ b/.agents/skills/triage/diagnose.md @@ -0,0 +1,90 @@ +# Diagnose + +Find the root cause of a reproduced bug in the Astro source code. + +**CRITICAL: You MUST always append to `report.md` before finishing, regardless of outcome. Even if you cannot identify the root cause, hit errors, or the investigation is inconclusive — always update `report.md` with your findings. The orchestrator and downstream skills depend on this file to determine what happened.** + +## Prerequisites + +These variables are referenced throughout this skill. They may be passed as args by an orchestrator, or inferred from the conversation when run standalone. + +- **`triageDir`** — Directory containing the reproduction project (e.g. `triage/issue-123`). If not passed as an arg, infer from previous conversation. +- **`report.md`** — File in `triageDir` that MAY exist. Contains the full context from all previous skills. + +## Overview + +1. Review the reproduction and error details from `report.md` +2. Locate the relevant source files in `packages/` +3. Add instrumentation to understand the code path +4. Identify the root cause +5. Append diagnosis findings to `report.md` + +## Step 1: Review the Reproduction + +Read `report.md` from the `triageDir` directory to understand: + +- The exact error message and stack trace +- Which command triggers the issue (build/dev/preview) +- What user code is involved + +**Skip if not reproduced:** If `report.md` shows the bug was NOT reproduced or was skipped (look for "could not reproduce", "SKIP REASON", "skipped: true"), append "DIAGNOSIS SKIPPED: No reproduction" to `report.md` and return `confidence: null`. + +Re-run the reproduction if needed to see the error firsthand: + +```bash +pnpm -C run build # or dev/preview +``` + +## Step 2: Locate Relevant Source Files + +Using the error messages, stack traces, and any other reproduction details from Step 1, identify the source files in `packages/` that are likely involved. + +## Step 3: Investigate with Instrumentation + +Add `console.log` statements to understand the code path: + +```typescript +// In packages/astro/src/core/build/index.ts +console.log('[DEBUG] Building page:', pagePath); +console.log('[DEBUG] Props:', JSON.stringify(props, null, 2)); +``` + +After adding logs: + +1. Rebuild the package (Example: `pnpm -C packages/astro build`) +2. Re-run the reproduction (Example: `pnpm -C build|dev|preview`) +3. Observe the debug output. + +Iterate until you understand: + +- What code path is executing +- What data is being passed +- Where the logic diverges from expected behavior + +## Step 4: Identify Root Cause + +Once you understand the issue, document: + +1. **Which file(s)** contain the bug +2. **What the code does wrong** — the specific logic error +3. **Why this causes the observed behavior** — how the error manifests +4. **What the fix should be** — high-level approach + +Consider: + +- Is this a regression from a recent change? +- Does this affect other similar use cases? +- Are there edge cases to consider? + +## Step 5: Write Output + +Append your diagnosis findings to the existing `report.md` (written by the reproduce skill). + +Include a new section with everything you learned: the root cause, affected files with line numbers, detailed explanation of the code path, instrumentation results, and your suggested fix approach. This helps the fix skill work faster. + +The report must include all information needed for a final GitHub comment to be generated later by the comment skill. Make sure to include: + +- Root cause explanation (which files, what logic is wrong, why) +- Affected file paths with line numbers +- Suggested fix approach +- Confidence level (`high`, `medium`, or `low`) and any caveats diff --git a/.agents/skills/triage/fix.md b/.agents/skills/triage/fix.md new file mode 100644 index 000000000000..5f4f16fdd0f9 --- /dev/null +++ b/.agents/skills/triage/fix.md @@ -0,0 +1,126 @@ +# Fix + +Develop and verify a fix for a diagnosed Astro bug. + +**CRITICAL: You MUST always append to `report.md` before finishing, regardless of outcome. Even if the fix attempt fails, you encounter errors, or you cannot resolve the bug — always update `report.md` with your findings. The orchestrator and downstream skills depend on this file to determine what happened.** + +## Prerequisites + +These variables are referenced throughout this skill. They may be passed as args by an orchestrator, or inferred from the conversation when run standalone. + +- **`triageDir`** — Directory containing the reproduction project (e.g. `triage/issue-123`). If not passed as an arg, infer from previous conversation. +- **`report.md`** — File in `triageDir` that MAY exist. Contains the full context from all previous skills. + +## Overview + +1. Review the diagnosis from `report.md` +2. Implement a minimal fix in `packages/` +3. Rebuild the affected package(s) +4. Verify the fix resolves the reproduction +5. Ensure no regressions +6. Generate git diff +7. Append fix details to `report.md` + +## Step 1: Review the Diagnosis + +Read `report.md` from the `triageDir` directory to understand: + +- The root cause and affected files +- The suggested approach +- Any edge cases to consider + +**Skip if prerequisites unmet:** Check `report.md`: If bug not reproduced/skipped OR diagnosis confidence is `low`/`null` OR no root cause found → append "FIX SKIPPED: [reason]" to `report.md` and return `fixed: false`. + +**Note:** The repo may be messy from previous steps. Check `git status` and either work from the current state or `git reset --hard` to start clean. + +## Step 2: Implement the Fix + +Make changes in `packages/` source files. Follow these principles: + +**Keep it minimal:** + +- Only change what's necessary to fix the bug +- Don't refactor unrelated code +- Don't add new features + +**Consider edge cases:** + +- Will this break other use cases? +- What happens with unusual input? +- Are there null/undefined checks needed? + +Example fix: + +```typescript +// Before (in packages/astro/src/core/render/component.ts) +export function renderComponent(component: AstroComponent, props: Props) { + const html = renderToString(component, props); + return html; +} + +// After +export function renderComponent(component: AstroComponent, props: Props) { + // Skip SSR for client:only components + if (props['client:only']) { + return ``; + } + const html = renderToString(component, props); + return html; +} +``` + +## Step 3: Rebuild the Package + +After making changes, rebuild the affected package: + +```bash +pnpm -C packages/astro build # or packages/integrations/ +``` + +Watch for build errors — fix any TypeScript issues before proceeding. + +## Step 4: Verify the Fix + +Re-run the reproduction, often using `pnpm run build`/`astro build` or `pnpm run dev`/`astro dev`. + +## Step 5: Check for Regressions + +Test that you didn't break anything new, and that normal cases still work. If you find regressions, refine the fix to handle all cases. + +## Step 6: Generate Git Diff + +From the repository root, generate the diff: + +```bash +git diff packages/ +``` + +This captures all your changes for the report. + +## Step 7: Write Output + +Append your fix details to the existing `report.md` (written by reproduce and diagnose skills). + +Include a new section with: what you changed, why, the full git diff, verification results, and any tradeoffs or alternative approaches considered. + +The report must include all information needed for a final GitHub comment to be generated later by the comment skill. Make sure to include: + +- What was changed and why +- The full git diff (unless it is massive, if it is) +- Whether the fix was successful or not +- Verification results (did the fix resolve the original error?) +- Any alternative approaches considered and their tradeoffs +- If the fix failed: what was tried and why it didn't work + +## Step 8: Clean Up the Working Directory + +1. Run `git status` and review all changed files +2. Revert any changes that are NOT part of the fix: + - Debug code, `console.log`s, or temporary test files + - Changes outside `packages/` that were only needed for diagnosis/reproduction + - Build artifacts that shouldn't be committed +3. Use `git checkout -- ` to discard unwanted changes +4. Confirm with a final `git status` that only the intended fix files remain +5. DO NOT commit or push anything yet! The user will handle that at a later step. + +The `triage/` directory is already gitignored, so it won't appear in `git status`. diff --git a/.agents/skills/triage/reproduce.md b/.agents/skills/triage/reproduce.md new file mode 100644 index 000000000000..77b3ae925d49 --- /dev/null +++ b/.agents/skills/triage/reproduce.md @@ -0,0 +1,125 @@ +# Reproduce + +Reproduce a GitHub issue to determine if a bug is valid and reproducible. + +**CRITICAL: You MUST always write `report.md` to the triage directory before finishing, regardless of outcome. Even if you encounter errors, cannot reproduce the bug, hit unexpected problems, or need to skip — always write `report.md`. The orchestrator and downstream skills depend on this file to determine what happened. If you finish without writing it, the entire pipeline fails silently.** + +## Prerequisites + +These variables are referenced throughout this skill. They may be passed as args by an orchestrator, or inferred from the conversation when run standalone. + +- **`triageDir`** — Directory containing the reproduction project (e.g. `triage/issue-123`). If not passed as an arg, infer from previous conversation. +- **`issueDetails`** - The issue details, often a string of JSON containing the GitHub issue title, body, and comments. If not passed as an arg, infer the issue from previous conversation and run `gh issue view ${issue_number} --json title,body,comments` to load the issue details directly from GitHub. + +## Overview + +1. Confirm the issue details +2. Analyze the issue for early exit conditions (host-specific, unsupported version, etc.) +3. Set up a reproduction project in the triage directory +4. Attempt to reproduce the bug +5. Write `report.md` with detailed findings + +## Step 1: Confirm Bug Details + +Confirm that you have access to `bugDetails` (load directly from GitHub if you do not, following the instructions above). + +**Otherwise**, fail — we cannot triage a bug that we have no details on. + +Once you have `bugDetails`, read carefully: + +- The bug description and expected vs actual behavior +- Any reproduction steps provided +- Environment details (Astro version from `astro info` output) +- Comments that might clarify the issue + +## Step 2: Check for Early Exit Conditions + +Before attempting reproduction, check if this issue should be skipped due to a limitation of our sandbox reproduction environment. + +If any condition below is met, skip to Step 6 and write `report.md` with the skip details. + +- **Not actionable** — Issue is not a bug report (this workflow can only act to triage bugs, cannot handle feature requests, suggestions, etc.). → skip reason: `not-actionable` +- **Unsupported version** — Astro 4.x or earlier (check `astro info` output or package.json). → skip reason: `unsupported-version` +- **Unsupported runtime** — Bug is specific to Bun or Deno. → skip reason: `unsupported-runtime` +- **Host-specific** — Bug is specific to Vercel, Netlify, Cloudflare, etc. (check for runtime adapter usage). → skip reason: `host-specific` +- **Maintainer override** — A maintainer commented that this issue cannot be reproduced here. Check status: `gh api "repos///collaborators/" --silent && echo "user is collaborator"`. → skip reason: `maintainer-override` + +## Step 3: Set Up Reproduction Project + +The reproduction project goes in the `triageDir` directory (e.g. `triage/gh-123`). If no `triageDir` is provided, default to `triage/gh-`. + +**If a StackBlitz URL is provided in the issue:** +The triage workspace has already been downloaded. Inspect what's there and proceed to configuration. + +**If no StackBlitz URL (fallback to example template):** +The workspace has been set up from `examples/minimal`. You may need to add dependencies. + +Sometimes, a user will provide a Gist URL instead of a StackBlitz URL to help show how to reproduce the issue. Use `gh gist view ` to fetch any included gists, to help get a better understanding of what the problem is. + +Check the issue to determine what's needed: + +- React components → `pnpm astro add react` (in the triage dir) +- MDX content → `pnpm astro add mdx` +- Specific adapter → `pnpm astro add node` (or vercel, netlify, etc.) + +## Step 4: Configure the Project + +Based on the issue, modify the triage project: + +1. Update `astro.config.mjs` with required configuration +2. Create pages, components, or middleware that trigger the bug +3. Add any additional files mentioned in the issue + +Keep the reproduction as minimal as possible — only add what's needed to trigger the bug. + +## Step 5: Attempt Reproduction + +Run commands to reproduce the issue: + +```bash +# For build-time issues +pnpm run build + +# For dev server issues +pnpm run dev +# Then use agent-browser to test: npx agent-browser http://localhost:4321/path + +# For preview issues +pnpm run build && pnpm run preview +``` + +Test both: + +1. **The broken case** — follow the steps to trigger the bug +2. **The working case** — verify the project works normally before the breaking change + +Document what you observe: + +- Exact error messages and stack traces +- Which command triggers the issue +- Whether the issue is consistent or intermittent + +## Step 6: Write Output + +Write `report.md` to the triage directory: + +### `report.md` — Detailed internal report for the next LLM stage + +Write a verbose report with everything you learned. This is NOT for humans — it's context for the next stage of the pipeline (diagnose/fix). **Downstream skills will NOT have access to the original issue — `report.md` is their only source of context.** Include: + +- The original issue title, description, and any relevant details from the issue body. It's better to include too much context from the original issue vs. too little. You never know what information will be useful to future steps in the workflow, like while trying to find the fix in the codebase. +- Full environment details +- All steps attempted and their results +- Complete error messages and stack traces +- Observations about the codebase, theories about root cause +- Anything that would help the next stage work faster + +Be thorough. More context is better here. + +The report must include all information needed for a final GitHub comment to be generated later by the comment skill. Make sure to include: + +- Environment details (package versions, Node.js version, package manager) +- Steps to reproduce (numbered list) +- Expected vs actual result +- Error messages and stack traces +- Whether the issue was reproduced, not reproduced, or skipped (and why) diff --git a/.flue/workflows/issue-triage.ts b/.flue/workflows/issue-triage.ts new file mode 100644 index 000000000000..37275a4e1416 --- /dev/null +++ b/.flue/workflows/issue-triage.ts @@ -0,0 +1,146 @@ +import type { Flue } from '@flue/client'; +import * as v from 'valibot'; + +const reproductionResultSchema = v.object({ + reproducible: v.pipe( + v.boolean(), + v.description('true if the bug was successfully reproduced, false otherwise'), + ), + skipped: v.pipe( + v.boolean(), + v.description( + 'true if reproduction was intentionally skipped (host-specific, unsupported version, etc.)', + ), + ), +}); + +const diagnoseResultSchema = v.object({ + confidence: v.pipe( + v.nullable(v.picklist(['high', 'medium', 'low'])), + v.description('Diagnosis confidence level, null if not attempted'), + ), +}); + +const fixResultSchema = v.object({ + fixed: v.pipe(v.boolean(), v.description('true if the bug was successfully fixed and verified')), + commitMessage: v.pipe( + v.nullable(v.string()), + v.description( + 'A short commit message describing the fix, e.g. "fix(auto-triage): prevent crash when rendering client:only components". null if not fixed.', + ), + ), +}); + +export default async function triage(flue: Flue) { + const { issueNumber } = flue.args as { + issueNumber: number; + }; + + const issueJson = await flue.shell(`gh issue view ${issueNumber} --json title,body,comments`, { + env: { GH_TOKEN: flue.secrets.GITHUB_TOKEN }, + }); + const issue = JSON.parse(issueJson.stdout) as { + title: string; + body: string; + comments: Array<{ author: { login: string }; body: string }>; + }; + + // If there are prior comments, this is a re-triage. Check whether new + // actionable information has been provided before running the full pipeline. + const hasExistingConversation = issue.comments.length > 0; + if (hasExistingConversation) { + const shouldRetriage = await flue.prompt( + `You are reviewing a GitHub issue conversation to decide whether a triage re-run is warranted. + +## Issue +**${issue.title}** + +${issue.body} + +## Conversation +${issue.comments.map((c) => `**@${c.author.login}:**\n${c.body}`).join('\n\n---\n\n')} + +## Your Task +Look at the messages since the last comment from astrobot-houston (or github-actions[bot]). +Consider comments from the original poster, maintainers, or other users who may have provided: +- New reproduction steps or environment details +- Corrections to a previously attempted reproduction +- Additional context about when/how the bug occurs +- Different configurations or versions to try + +Then decide how to respond: +1. If there is new, actionable information that could lead to a different reproduction result +than what was already attempted, respond with "yes". +2. If someone is intentionally asking you to retry triage, respond with "yes". +3. If the new comments are just acknowledgments, thanks, unrelated discussion, or do not add +meaningful reproduction information, respond with "no". + +Return only "yes" or "no" inside the ---RESULT_START--- / ---RESULT_END--- block.`, + { result: v.picklist(['yes', 'no']) }, + ); + + if (shouldRetriage === 'no') { + return { skipped: true, reason: 'No new actionable information' }; + } + } + + // Run the triage pipeline: reproduce → diagnose → fix + const reproduceResult = await flue.skill('triage/reproduce.md', { + args: { issueNumber }, + result: reproductionResultSchema, + }); + const diagnoseResult = await flue.skill('triage/diagnose.md', { result: diagnoseResultSchema }); + const fixResult = await flue.skill('triage/fix.md', { result: fixResultSchema }); + let isPushed = false; + + // If a successful fix was created, push the fix up to a new branch on GitHub. + // The comment we post below will reference that branch, then a maintainer can choose to: + // - checkout that branch locally, using the fix as a starting point + // - create a PR from that branch entirely in the GH UI + // - ignore it completely + if (fixResult.fixed) { + const status = await flue.shell('git status --porcelain'); + if (status.stdout.trim()) { + await flue.shell('git add -A'); + await flue.shell( + `git commit -m ${JSON.stringify(fixResult.commitMessage ?? 'fix(auto-triage): automated fix')}`, + ); + const pushResult = await flue.shell(`git push origin HEAD:refs/heads/${flue.branch}`); + console.info('push result:', pushResult); + isPushed = pushResult.exitCode === 0; + } + } + + const branchName = isPushed ? flue.branch : null; + const comment = await flue.skill('triage/comment.md', { + args: { branchName }, + result: v.pipe( + v.string(), + v.description( + 'Return only the GitHub comment body generated from the template, following the included template directly. This returned comment must start with "**I was able to reproduce this issue.**" or "**I was unable to reproduce this issue.**"', + ), + ), + }); + + await flue.shell(`gh issue comment ${issueNumber} --body-file -`, { + stdin: comment, + env: { GH_TOKEN: flue.secrets.GITHUB_TOKEN }, + }); + + if (reproduceResult.reproducible) { + await flue.shell(`gh issue edit ${issueNumber} --remove-label "needs triage"`, { + env: { GH_TOKEN: flue.secrets.GITHUB_TOKEN }, + }); + } else if (reproduceResult.skipped) { + // Triage was skipped due to a runner limitation. Keep "needs triage" so a + // maintainer can still pick it up, and add "auto triage skipped" to prevent + // the workflow from re-running on every new comment. + await flue.shell(`gh issue edit ${issueNumber} --add-label "auto triage skipped"`, { + env: { GH_TOKEN: flue.secrets.GITHUB_TOKEN }, + }); + } + + // If not reproducible: "needs triage" label stays. + // The loop continues when the author (or another user) replies. + return { reproduceResult, diagnoseResult, fixResult, isPushed }; +} diff --git a/.github/workflows/issue-triage.yml b/.github/workflows/issue-triage.yml new file mode 100644 index 000000000000..e12b3850b532 --- /dev/null +++ b/.github/workflows/issue-triage.yml @@ -0,0 +1,84 @@ +name: Issue Triage + +on: + issues: + types: [opened] + issue_comment: + types: [created] + +jobs: + triage: + # 1. Skip old issues (only run on issues created after this workflow was created) + # 2. Skip issues with "auto triage skipped" label + # 3. Skip pull requests (issues only) + # 4. One of these conditions must be met: + # 4a. Issue was just created + # 4b. Issue comment was just created, and "needs triage" label exists + if: >- + github.event.issue.created_at >= '2026-02-11' && + !contains(github.event.issue.labels.*.name, 'auto triage skipped') && + !github.event.issue.pull_request && + ((github.event.action == 'opened') || + (github.event.action == 'created' && contains(github.event.issue.labels.*.name, 'needs triage'))) + runs-on: ubuntu-latest + timeout-minutes: 60 + permissions: + contents: write + issues: write + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup PNPM + uses: pnpm/action-setup@v4 + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 24 + cache: pnpm + + - name: Install OpenCode + run: | + curl -fsSL https://opencode.ai/install | bash + echo "/home/runner/.opencode/bin" >> $GITHUB_PATH + + - name: Install agent-browser + run: pnpm install -g agent-browser --config.onlyBuiltDependencies='*' && agent-browser install + + - name: Install deps + run: pnpm install --frozen-lockfile + + - name: Build + run: pnpm build + + - name: Start Cloudflare Tunnel + run: | + curl -fsSL https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 -o /usr/local/bin/cloudflared + chmod +x /usr/local/bin/cloudflared + cloudflared tunnel --url http://localhost:48765 --no-autoupdate 2>&1 | tee /tmp/cloudflared.log & + # Wait for tunnel URL to appear + for i in $(seq 1 30); do + if grep -qo 'https://[^ ]*\.trycloudflare\.com' /tmp/cloudflared.log; then + break + fi + sleep 1 + done + echo "==========================================" + echo "TUNNEL URL:" + grep -o 'https://[^ ]*\.trycloudflare\.com' /tmp/cloudflared.log || echo "WARNING: tunnel URL not found" + echo "==========================================" + echo "" + echo "To attach from your machine:" + echo " OPENCODE_API_URL=\$(grep -o 'https://[^ ]*\\.trycloudflare\\.com' /tmp/cloudflared.log) opencode attach" + + - name: Run workflow + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + ANTHROPIC_API_KEY: ${{ secrets.CI_ANTHROPIC_API_KEY }} + ISSUE_NUMBER: ${{ github.event.issue.number }} + run: | + pnpm flue run .flue/workflows/issue-triage.ts \ + --args "{\"issueNumber\": $ISSUE_NUMBER, \"triageDir\": \"triage/issue-$ISSUE_NUMBER\"}" \ + --branch "flue/fix-$ISSUE_NUMBER" \ + --model anthropic/claude-opus-4-6 diff --git a/.gitignore b/.gitignore index da839bc6fbe8..2a55bd13e0b5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ node_modules/ +/triage/ dist/ *.tsbuildinfo .DS_Store diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 000000000000..991ea5b448e4 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,74 @@ +## Style Guide + +- Not defined here. For now, follow the same conventions and patterns that you detect in the surrounding code. Keep +- Keep formatting consistent. Our rules are defined in our [biome.jsonc](./biome.jsonc) file, enforced by Biome. +- Run `pnpm format` to auto-format the entire repo. +- Run `pnpm lint` to lint the entire repo. + +# Source Structure + +This is a pnpm workspace monorepo with the following directory structure: + +``` +packages/ +├── astro/ # astro -- The core framework package +│ └── src/ +│ ├── core/ # Build pipeline, rendering, routing +│ ├── vite-plugin-astro/ # Vite integration +│ ├── content/ # Content collections +│ └── ... +├── integrations/ +│ ├── react/ # @astrojs/react +│ ├── node/ # @astrojs/node +│ ├── cloudflare/ # @astrojs/cloudflare +│ └── ... +└── markdown/ + └── remark/ # @astrojs/markdown-remark +``` + +When you run `pnpm install`, source packages in `packages/` are symlinked into `node_modules/` of their dependants via `workspace:*` dependencies. + +In error stack traces, built files in `node_modules/` will often map to TypeScript source files in the `packages/` directory. + +- `node_modules/astro/dist/...` → `packages/astro/src/...` +- `node_modules/@astrojs/react/...` → `packages/integrations/react/src/...` + +Note: Edits to source files take effect after rebuilding the package via `pnpm build`. + +# Running Tests + +- Run `pnpm test` in workspace root or package directory to run full test suite (can be slow!) +- Integration tests live in special `packages/integrations` folders. +- Example: `pnpm -C astro-scripts test` - Run a single package test suite +- Example: `pnpm -C astro-scripts test "test/actions.test.js"` - Run a single test file +- Example: `pnpm -C astro-scripts test "test/**/*.test.js" --match "CSS"` - Run specific tests matching a string or regex patterns +- Example: `pnpm -C astro-scripts test "test/{actions,css,middleware}.test.js"` - Run multiple test files +- Key flags: + - `--match` / `-m`: Filter tests by name pattern (regex) + - `--only` / `-o`: Run only tests marked with `.only` + - `--parallel` / `-p`: Run tests in parallel (default is sequential) + - `--timeout` / `-t`: Set timeout in milliseconds + - `--watch` / `-w`: Watch mode + +# Astro Quick Reference + +- Use `astro dev` to start the local dev server with HMR. +- Use `astro build` to create a production build in `dist/` (static or Node server). +- Use `astro preview` to serve the production build locally (static or Node server). +- Use `astro check` to run type checking and diagnostics. +- Use `astro sync` to generate and update TypeScript types. +- Use `astro add` to install and configure an official integration. +- Fetch **LLM-optimized** docs at https://docs.astro.build/llms.txt. +- Fetch **Full docs** at https://docs.astro.build/ (primary source, use when llms.txt lacks info). + +# Working with Astro + +- Use `astro dev` and `astro preview` in the background to prevent hanging your entire session, and use `&` to run them in the background. Use `--port RANDOM_NUMBER --strictPort` to avoid port conflicts. Cleanup old servers when you're done. +- Use `astro dev` and `astro preview` as web servers for Astro project. They are reliable. Don't use other web servers for testing. +- Use `pnpm -C ` for project-local commands when working in packages/examples/triage directories. Only omit `-C` flag when intentionally working in the monorepo root. (Example: `pnpm -C packages/astro build`, `pnpm -C examples/blog dev`) +- Use `agent-browser` for web automation or when UI interaction, long-running browsers, or HMR testing is required. Use `agent-browser --help` for all commands. Use this core workflow: + - Example: `agent-browser open ` - Navigate to page + - Example: `agent-browser snapshot -i` - Get interactive elements with refs (@e1, @e2) + - Example: `agent-browser click @e1` / `fill @e2 "text"` - Interact using refs + - Re-snapshot after page changes. + - Note: If you can't find `agent-browser`, your machine may not have it installed. If this happens, ask the user to run `npm install -g agent-browser && agent-browser install`. If you are running in headless mode with no human operator and need this tool to complete your job, it is best to fail the job vs. trying to work around not having the tool. diff --git a/knip.js b/knip.js index 81a8ce72e468..0b6ebf7efc04 100644 --- a/knip.js +++ b/knip.js @@ -3,7 +3,7 @@ const testEntry = 'test/**/*.test.js'; /** @type {import('knip').KnipConfig} */ export default { - ignore: ['**/test/**/{fixtures,_temp-fixtures}/**', '.github/scripts/**'], + ignore: ['**/test/**/{fixtures,_temp-fixtures}/**', 'triage/**', '.github/scripts/**'], tags: ['-lintignore'], ignoreWorkspaces: [ 'examples/**', @@ -20,6 +20,7 @@ export default { // vsce and ovsx are only used in CI for publishing, and due to how we have to publish the VS Code extension have // to be installed in the vscode package, but knip is expecting them to be in the root node_modules ignoreBinaries: ['docgen', 'docgen:errors', 'playwright', 'vsce', 'ovsx'], + entry: ['.flue/workflows/*'], }, 'packages/*': { entry: [testEntry], diff --git a/package.json b/package.json index cb6b469765be..7d9d30dbc72c 100644 --- a/package.json +++ b/package.json @@ -64,6 +64,8 @@ "@biomejs/biome": "2.3.6", "@changesets/changelog-github": "^0.5.2", "@changesets/cli": "^2.29.8", + "@flue/cli": "^0.0.17", + "@flue/client": "^0.0.9", "@types/node": "^18.19.115", "esbuild": "0.25.5", "eslint": "^9.39.2", @@ -76,6 +78,7 @@ "tinyglobby": "^0.2.15", "turbo": "^2.8.3", "typescript": "~5.9.3", - "typescript-eslint": "^8.54.0" + "typescript-eslint": "^8.54.0", + "valibot": "^1.0.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fc16207bc693..d56a39442b57 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -24,6 +24,12 @@ importers: '@changesets/cli': specifier: ^2.29.8 version: 2.29.8(@types/node@18.19.130) + '@flue/cli': + specifier: ^0.0.17 + version: 0.0.17(typescript@5.9.3) + '@flue/client': + specifier: ^0.0.9 + version: 0.0.9(typescript@5.9.3) '@types/node': specifier: ^18.19.115 version: 18.19.130 @@ -63,6 +69,9 @@ importers: typescript-eslint: specifier: ^8.54.0 version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + valibot: + specifier: ^1.0.0 + version: 1.2.0(typescript@5.9.3) benchmark: dependencies: @@ -8794,6 +8803,13 @@ packages: '@fastify/static@9.0.0': resolution: {integrity: sha512-r64H8Woe/vfilg5RTy7lwWlE8ZZcTrc3kebYFMEUBrMqlydhQyoiExQXdYAy2REVpST/G35+stAM8WYp1WGmMA==} + '@flue/cli@0.0.17': + resolution: {integrity: sha512-mkBo6SpeYwyH/eAlA80HcGdtPiAVZgdewi2e/BlA/+uL2dJ+CU8d3dpFsXtR00bvmRMJuzYfuZn7SQGNeHy4Bw==} + hasBin: true + + '@flue/client@0.0.9': + resolution: {integrity: sha512-gugVi8LNrlfiRAq84uPsiQCk5y23ToU2M1GJpsyRSS8zZ6Ho6HC2Id22Wsayyv/xtKAIh646Aktvn49OJV4wSA==} + '@fontsource/monofett@5.2.8': resolution: {integrity: sha512-cUtT8ScH3HHsMBkRrXFCrhGpKqRrKVNOhnYVSusECfB7g13YZjOrrLlhlc3o+R2IYpRrQQg/T/febSVD6k2Dhw==} @@ -9360,6 +9376,9 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@opencode-ai/sdk@1.1.56': + resolution: {integrity: sha512-VFIk4wS7chc1fbodMXstBHV6uj9z25g3c72SlwBYjzPZZLgtr9IUK+FyGMUYefXYeeXJ/l91CdmfjCjDZTmD1g==} + '@opentelemetry/api-logs@0.203.0': resolution: {integrity: sha512-9B9RU0H7Ya1Dx/Rkyc4stuBZSGVQF27WigitInx2QQoj6KUpEFYPKoWjdFTunJYxmXmh17HeBvbMa1EhGyPmqQ==} engines: {node: '>=8.0.0'} @@ -10365,6 +10384,11 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@valibot/to-json-schema@1.5.0': + resolution: {integrity: sha512-GE7DmSr1C2UCWPiV0upRH6mv0cCPsqYGs819fb6srCS1tWhyXrkGGe+zxUiwzn/L1BOfADH4sNjY/YHCuP8phQ==} + peerDependencies: + valibot: ^1.2.0 + '@vercel/analytics@1.6.1': resolution: {integrity: sha512-oH9He/bEM+6oKlv3chWuOOcp8Y6fo6/PSro8hEkgCW3pu9/OiCXiUpRUogDh3Fs3LH2sosDrx8CxeOLBEE+afg==} peerDependencies: @@ -15651,6 +15675,14 @@ packages: resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} engines: {node: '>=10.12.0'} + valibot@1.2.0: + resolution: {integrity: sha512-mm1rxUsmOxzrwnX5arGS+U4T25RdvpPjPN4yR0u9pUBov9+zGVtO84tif1eY4r6zWxVxu3KzIyknJy3rxfRZZg==} + peerDependencies: + typescript: '>=5' + peerDependenciesMeta: + typescript: + optional: true + validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} @@ -18028,6 +18060,20 @@ snapshots: fastq: 1.19.1 glob: 13.0.1 + '@flue/cli@0.0.17(typescript@5.9.3)': + dependencies: + '@flue/client': 0.0.9(typescript@5.9.3) + transitivePeerDependencies: + - typescript + + '@flue/client@0.0.9(typescript@5.9.3)': + dependencies: + '@opencode-ai/sdk': 1.1.56 + '@valibot/to-json-schema': 1.5.0(valibot@1.2.0(typescript@5.9.3)) + valibot: 1.2.0(typescript@5.9.3) + transitivePeerDependencies: + - typescript + '@fontsource/monofett@5.2.8': {} '@fontsource/montserrat@5.2.8': {} @@ -18763,6 +18809,8 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 + '@opencode-ai/sdk@1.1.56': {} + '@opentelemetry/api-logs@0.203.0': dependencies: '@opentelemetry/api': 1.9.0 @@ -19704,6 +19752,10 @@ snapshots: '@ungap/structured-clone@1.3.0': {} + '@valibot/to-json-schema@1.5.0(valibot@1.2.0(typescript@5.9.3))': + dependencies: + valibot: 1.2.0(typescript@5.9.3) + '@vercel/analytics@1.6.1(react@19.2.4)(svelte@5.50.0)(vue@3.5.27(typescript@5.9.3))': optionalDependencies: react: 19.2.4 @@ -25950,6 +26002,10 @@ snapshots: '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 + valibot@1.2.0(typescript@5.9.3): + optionalDependencies: + typescript: 5.9.3 + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 3dc6a9149d78..b9069d9a7fb1 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -2,6 +2,7 @@ packages: - 'packages/**/*' - 'packages/astro/test/units/_temp-fixtures' - 'examples/**/*' + - 'triage/*' - 'smoke/**/*' - 'scripts' - 'benchmark' diff --git a/turbo.json b/turbo.json index 4ee3cc42e9dd..6a805237c4e1 100644 --- a/turbo.json +++ b/turbo.json @@ -10,6 +10,7 @@ "!performance/**/*", "!.astro/**/*", "!.cache/**/*", + "!.turbo/**/*", "!mod.js", "!mod.js.map" ], @@ -26,6 +27,7 @@ "!performance/**/*", "!.astro/**/*", "!.cache/**/*", + "!.turbo/**/*", "!mod.js", "!mod.js.map" ], From 56be09a1f8e6ff7afe7090184e257522fdfe770c Mon Sep 17 00:00:00 2001 From: "Fred K. Schott" Date: Wed, 11 Feb 2026 23:20:04 +0000 Subject: [PATCH 3/4] [ci] format --- .flue/workflows/issue-triage.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.flue/workflows/issue-triage.ts b/.flue/workflows/issue-triage.ts index 37275a4e1416..78422d644b6a 100644 --- a/.flue/workflows/issue-triage.ts +++ b/.flue/workflows/issue-triage.ts @@ -96,8 +96,8 @@ Return only "yes" or "no" inside the ---RESULT_START--- / ---RESULT_END--- block // If a successful fix was created, push the fix up to a new branch on GitHub. // The comment we post below will reference that branch, then a maintainer can choose to: // - checkout that branch locally, using the fix as a starting point - // - create a PR from that branch entirely in the GH UI - // - ignore it completely + // - create a PR from that branch entirely in the GH UI + // - ignore it completely if (fixResult.fixed) { const status = await flue.shell('git status --porcelain'); if (status.stdout.trim()) { From 1135b4e8117b647d11352cad4070993202cd1818 Mon Sep 17 00:00:00 2001 From: Chris Swithinbank Date: Thu, 12 Feb 2026 01:18:11 +0100 Subject: [PATCH 4/4] Fix a flaky content collection test (#15477) * Fix a flaky content collection test * Horrible editor experience bites again * forgot how astro works --- .../test/content-collections-render.test.js | 22 +++++-------------- .../src/pages/get-collection-equality.astro | 15 +++++++++++++ .../src/pages/sort-blog-collection.astro | 22 ------------------- 3 files changed, 20 insertions(+), 39 deletions(-) create mode 100644 packages/astro/test/fixtures/content/src/pages/get-collection-equality.astro delete mode 100644 packages/astro/test/fixtures/content/src/pages/sort-blog-collection.astro diff --git a/packages/astro/test/content-collections-render.test.js b/packages/astro/test/content-collections-render.test.js index 75f47bc4eade..4e6b680b0446 100644 --- a/packages/astro/test/content-collections-render.test.js +++ b/packages/astro/test/content-collections-render.test.js @@ -142,23 +142,11 @@ describe('Content Collections - render()', () => { it('getCollection should return new instances of the array to be mutated safely', async () => { const app = await fixture.loadTestAdapterApp(); - let request = new Request('http://example.com/'); - let response = await app.render(request); - let html = await response.text(); - let $ = cheerio.load(html); - const firstText = $('li').first().text(); - - request = new Request('http://example.com/sort-blog-collection'); - response = await app.render(request); - html = await response.text(); - $ = cheerio.load(html); - assert.notEqual($('li').first().text(), firstText); - - request = new Request('http://example.com/'); - response = await app.render(request); - html = await response.text(); - $ = cheerio.load(html); - assert.equal($('li').first().text(), firstText); + const request = new Request('http://example.com/get-collection-equality'); + const response = await app.render(request); + const html = await response.text(); + const $ = cheerio.load(html); + assert.equal($('[data-are-equal]').first().text(), 'false'); }); }); diff --git a/packages/astro/test/fixtures/content/src/pages/get-collection-equality.astro b/packages/astro/test/fixtures/content/src/pages/get-collection-equality.astro new file mode 100644 index 000000000000..0b63a5e1d764 --- /dev/null +++ b/packages/astro/test/fixtures/content/src/pages/get-collection-equality.astro @@ -0,0 +1,15 @@ +--- +import { getCollection } from 'astro:content'; + +const blog1 = await getCollection('blog'); +const blog2 = await getCollection('blog'); +--- + + + Index + + +

Are two collection instances different objects?

+

{JSON.stringify(blog1 === blog2)}

+ + diff --git a/packages/astro/test/fixtures/content/src/pages/sort-blog-collection.astro b/packages/astro/test/fixtures/content/src/pages/sort-blog-collection.astro deleted file mode 100644 index 9eb681ee259c..000000000000 --- a/packages/astro/test/fixtures/content/src/pages/sort-blog-collection.astro +++ /dev/null @@ -1,22 +0,0 @@ ---- -import { getCollection } from 'astro:content'; - -const blog = await getCollection('blog'); - -// Sort descending by title, make sure mutating `blog` doesn't mutate other pages that call `getCollection` too -blog.sort((a, b) => b.data.title.localeCompare(a.data.title)); ---- - - - Index - - -

Blog Posts

- -
    - {blog.map(post => ( -
  • { post.data.title }
  • - ))} -
- -