Conversation
🧪 E2E Test Results❌ Some tests failed Summary
❌ Failed Tests▲ Vercel Production (2 failed)fastify (1 failed):
nextjs-turbopack (1 failed):
📦 Local Production (1 failed)fastify-stable (1 failed):
🌍 Community Worlds (74 failed)mongodb (7 failed):
redis (7 failed):
turso (60 failed):
Details by Category❌ ▲ Vercel Production
✅ 💻 Local Development
❌ 📦 Local Production
✅ 🐘 Local Postgres
✅ 🪟 Windows
❌ 🌍 Community Worlds
✅ 📋 Other
❌ Some E2E test jobs failed:
Check the workflow run for details. |
🦋 Changeset detectedLatest commit: ec0b575 The changes in this PR will be included in the next version bump. This PR includes changesets to release 16 packages
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 |
📊 Benchmark Results
workflow with no steps💻 Local Development
▲ Production (Vercel)
🔍 Observability: Express | Next.js (Turbopack) workflow with 1 step💻 Local Development
▲ Production (Vercel)
🔍 Observability: Next.js (Turbopack) | Express workflow with 10 sequential steps💻 Local Development
▲ Production (Vercel)
🔍 Observability: Next.js (Turbopack) | Express workflow with 25 sequential steps💻 Local Development
▲ Production (Vercel)
🔍 Observability: Express | Next.js (Turbopack) workflow with 50 sequential steps💻 Local Development
▲ Production (Vercel)
🔍 Observability: Express | Next.js (Turbopack) Promise.all with 10 concurrent steps💻 Local Development
▲ Production (Vercel)
🔍 Observability: Express | Next.js (Turbopack) Promise.all with 25 concurrent steps💻 Local Development
▲ Production (Vercel)
🔍 Observability: Next.js (Turbopack) | Express Promise.all with 50 concurrent steps💻 Local Development
▲ Production (Vercel)
🔍 Observability: Express | Next.js (Turbopack) Promise.race with 10 concurrent steps💻 Local Development
▲ Production (Vercel)
🔍 Observability: Express | Next.js (Turbopack) Promise.race with 25 concurrent steps💻 Local Development
▲ Production (Vercel)
🔍 Observability: Express | Next.js (Turbopack) Promise.race with 50 concurrent steps💻 Local Development
▲ Production (Vercel)
🔍 Observability: Next.js (Turbopack) | Express workflow with 10 sequential data payload steps (10KB)💻 Local Development
▲ Production (Vercel)
🔍 Observability: Express | Next.js (Turbopack) workflow with 25 sequential data payload steps (10KB)💻 Local Development
▲ Production (Vercel)
🔍 Observability: Express | Next.js (Turbopack) workflow with 50 sequential data payload steps (10KB)💻 Local Development
▲ Production (Vercel)
🔍 Observability: Express | Next.js (Turbopack) workflow with 10 concurrent data payload steps (10KB)💻 Local Development
▲ Production (Vercel)
🔍 Observability: Express | Next.js (Turbopack) workflow with 25 concurrent data payload steps (10KB)💻 Local Development
▲ Production (Vercel)
🔍 Observability: Express | Next.js (Turbopack) workflow with 50 concurrent data payload steps (10KB)💻 Local Development
▲ Production (Vercel)
🔍 Observability: Next.js (Turbopack) | Express Stream Benchmarks (includes TTFB metrics)workflow with stream💻 Local Development
▲ Production (Vercel)
🔍 Observability: Next.js (Turbopack) | Express stream pipeline with 5 transform steps (1MB)💻 Local Development
▲ Production (Vercel)
🔍 Observability: Express | Next.js (Turbopack) 10 parallel streams (1MB each)💻 Local Development
▲ Production (Vercel)
🔍 Observability: Express | Next.js (Turbopack) fan-out fan-in 10 streams (1MB each)💻 Local Development
▲ Production (Vercel)
🔍 Observability: Next.js (Turbopack) | Express SummaryFastest Framework by WorldWinner determined by most benchmark wins
Fastest World by FrameworkWinner determined by most benchmark wins
Column Definitions
Worlds:
❌ Some benchmark jobs failed:
Check the workflow run for details. |
There was a problem hiding this comment.
Pull request overview
Updates the builders to write .gitignore files next to generated custom workflow manifest outputs (instead of editing a repo root ignore), and aligns manifest path resolution with the builder workingDir. Also updates the example app to emit the custom manifest under .well-known/workflow/manifest.js.
Changes:
- Add
ensureGeneratedFileGitignore()(with tests) to create/append a colocated.gitignoreentry for generated manifests. - Resolve
workflowManifestPathrelative toworkingDirand invoke the new gitignore writer after emitting the manifest. - Move the example app’s custom manifest output from root
manifest.jsto.well-known/workflow/manifest.js, removing the old ignore/output wiring.
Reviewed changes
Copilot reviewed 7 out of 7 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| workbench/example/turbo.json | Removes root manifest.js from Turbo build outputs to match the new manifest location. |
| workbench/example/package.json | Updates example build script to output the manifest under .well-known/workflow/manifest.js. |
| workbench/example/.gitignore | Removes root-level manifest.js ignore since it’s no longer generated there. |
| packages/builders/src/gitignore.ts | New helper that writes/updates colocated .gitignore files for generated outputs. |
| packages/builders/src/gitignore.test.ts | Adds Vitest coverage for the colocated .gitignore behavior. |
| packages/builders/src/base-builder.ts | Resolves manifest paths via workingDir and calls the new gitignore helper after writing the manifest. |
| .changeset/ignore-generated-manifest.md | Changeset entry for the @workflow/builders patch release. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
packages/builders/src/gitignore.ts
Outdated
| const resolvedWorkingDir = resolve(workingDir); | ||
| const resolvedFilePath = resolve(resolvedWorkingDir, filePath); | ||
| const relativePath = normalizeRelativePath( | ||
| relative(resolvedWorkingDir, resolvedFilePath) | ||
| ); | ||
|
|
||
| if (!relativePath || isOutsideRoot(relativePath)) { | ||
| return false; | ||
| } |
packages/builders/src/gitignore.ts
Outdated
| const gitignorePath = join(outputDir, '.gitignore'); | ||
| const entry = basename(resolvedFilePath); | ||
|
|
||
| let existing = ''; | ||
| try { | ||
| existing = await readFile(gitignorePath, 'utf8'); | ||
| } catch (error) { | ||
| if ((error as NodeJS.ErrnoException).code !== 'ENOENT') { | ||
| throw error; | ||
| } | ||
| } | ||
|
|
||
| const lines = existing.split(/\r?\n/).map((line) => line.trim()); | ||
| if (lines.includes('*') || lines.includes(entry) || lines.includes(`/${entry}`)) { | ||
| return false; | ||
| } |
There was a problem hiding this comment.
Pull request overview
Adds automatic .gitignore generation in the public/static manifest output directories created when WORKFLOW_PUBLIC_MANIFEST=1, so generated manifest.json files don’t show up as untracked changes in app repos.
Changes:
- Write a colocated
.gitignoreintopublic/.well-known/workflow/v1(Next.js eager/deferred) andstatic/.well-known/workflow/v1(SvelteKit). - Write a colocated
.gitignoreinto.vercel/output/static/.well-known/workflow/v1(Vercel Build Output API). - Add a changeset to publish patch releases for affected packages.
Reviewed changes
Copilot reviewed 5 out of 6 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| workbench/example/.gitignore | Keeps workbench example ignore rules aligned (no functional change). |
| packages/sveltekit/src/builder.ts | Writes .gitignore into SvelteKit static/.well-known/workflow/v1 when exposing the public manifest. |
| packages/next/src/builder-eager.ts | Writes .gitignore into Next.js public/.well-known/workflow/v1 when exposing the public manifest. |
| packages/next/src/builder-deferred.ts | Writes .gitignore (via writeFileIfChanged) into Next.js public/.well-known/workflow/v1 when exposing the public manifest. |
| packages/builders/src/vercel-build-output-api.ts | Writes .gitignore into build-output static manifest dir when exposing the public manifest. |
| .changeset/ignore-generated-manifest.md | Patch bumps for builders/next/sveltekit with a note about generated .gitignore. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| 'static/.well-known/workflow/v1' | ||
| ); | ||
| await mkdir(staticManifestDir, { recursive: true }); | ||
| await writeFile(join(staticManifestDir, '.gitignore'), '*'); |
| 'public/.well-known/workflow/v1' | ||
| ); | ||
| await mkdir(publicManifestDir, { recursive: true }); | ||
| await writeFile(join(publicManifestDir, '.gitignore'), '*'); |
| await this.writeFileIfChanged( | ||
| join(publicManifestDir, '.gitignore'), | ||
| '*' | ||
| ); |
| 'static/.well-known/workflow/v1' | ||
| ); | ||
| await mkdir(staticManifestDir, { recursive: true }); | ||
| await writeFile(join(staticManifestDir, '.gitignore'), '*'); |
TooTallNate
left a comment
There was a problem hiding this comment.
The location of the gitignore that copilot flagged seems valid
Summary
.gitignorefiles into the public/static manifest output directories created whenWORKFLOW_PUBLIC_MANIFEST=1.well-known/workflowoutputs instead of touching the project root.gitignoreCloses #1521
Testing
node_modulesis missing)