[cli] Print notice on CLI startup when detecting an outdated version - #701

Merged
VaguelySerious merged 17 commits into
mainfrom
peter/cli-check-for-updates-manual
Jan 2, 2026
Merged

[cli] Print notice on CLI startup when detecting an outdated version#701
VaguelySerious merged 17 commits into
mainfrom
peter/cli-check-for-updates-manual

Conversation

@VaguelySerious

@VaguelySeriousVaguelySerious commented Dec 29, 2025

Copy link
Copy Markdown
Member

This superseeds #657, which tried to use an npm plugin for this job, but was ugly and didn't work with pre-release versions, so I had claude implement it instead.

Essentially:

  • First time you run the CLI it'll do a sync check to npm (failures being ignored) for new version, caching this for 3 days
  • Update note will be displayed in message header on every invocation in interactive mode, where we would usually just display the version
    • This might not be good enough for notifying users consistently. If this code seems good, I can extract it into utils, and also import it in the builder code to print during build in a shorter format.
  • Changing the package version busts the cache, so upgrading will reset the cache
  • i.e. also users who upgrade to latest won't see the "new version is available" note until at the earliest 3 day after that
  • The message may be off if someone installs @workflow/cli globally separately from workflow, since p i workflow@latest wouldn't resolve the update warning, but this seems like a minor concern.
image

Signed-off-by: Peter Wielander <mittgfu@gmail.com>
@vercel

vercelBot commented Dec 29, 2025

Copy link
Copy Markdown
Contributor

@changeset-bot

changeset-botBot commented Dec 29, 2025

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 3d0d66e

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

This PR includes changesets to release 4 packages
NameType
@workflow/cliPatch
workflowPatch
@workflow/world-testingPatch
@workflow/aiPatch

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

@github-actions

github-actionsBot commented Dec 29, 2025

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

Some tests failed

Summary

PassedFailedSkippedTotal
✅ ▲ Vercel Production308011319
✅ 💻 Local Development28208290
✅ 📦 Local Production28208290
✅ 🐘 Local Postgres28208290
✅ 🪟 Windows290029
❌ 🌍 Community Worlds117110128
Total130011351346

❌ Failed Tests

🌍 Community Worlds (11 failed)

mongodb (1 failed):

  • webhookWorkflow

starter (9 failed):

  • addTenWorkflow
  • addTenWorkflow
  • retryAttemptCounterWorkflow
  • crossFileErrorWorkflow - stack traces work across imported modules
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly

turso (1 failed):

  • webhookWorkflow

Details by Category

✅ ▲ Vercel Production
AppPassedFailedSkipped
✅ astro2801
✅ example2801
✅ express2801
✅ fastify2801
✅ hono2801
✅ nextjs-turbopack2801
✅ nextjs-webpack2801
✅ nitro2801
✅ nuxt2801
✅ sveltekit2801
✅ vite2801
✅ 💻 Local Development
AppPassedFailedSkipped
✅ astro-stable2801
✅ express-stable2801
✅ fastify-stable2801
✅ hono-stable2801
✅ nextjs-turbopack-stable2900
✅ nextjs-webpack-stable2900
✅ nitro-stable2801
✅ nuxt-stable2801
✅ sveltekit-stable2801
✅ vite-stable2801
✅ 📦 Local Production
AppPassedFailedSkipped
✅ astro-stable2801
✅ express-stable2801
✅ fastify-stable2801
✅ hono-stable2801
✅ nextjs-turbopack-stable2900
✅ nextjs-webpack-stable2900
✅ nitro-stable2801
✅ nuxt-stable2801
✅ sveltekit-stable2801
✅ vite-stable2801
✅ 🐘 Local Postgres
AppPassedFailedSkipped
✅ astro-stable2801
✅ express-stable2801
✅ fastify-stable2801
✅ hono-stable2801
✅ nextjs-turbopack-stable2900
✅ nextjs-webpack-stable2900
✅ nitro-stable2801
✅ nuxt-stable2801
✅ sveltekit-stable2801
✅ vite-stable2801
✅ 🪟 Windows
AppPassedFailedSkipped
✅ nextjs-turbopack2900
❌ 🌍 Community Worlds
AppPassedFailedSkipped
✅ mongodb-dev300
❌ mongodb2810
✅ redis-dev300
✅ redis2900
✅ starter-dev300
❌ starter2090
✅ turso-dev300
❌ turso2810

📋 View full workflow run

@github-actions

github-actionsBot commented Dec 29, 2025

Copy link
Copy Markdown
Contributor

📊 Benchmark Results

📈 Comparing against baseline from main branch. Green 🟢 = faster, Red 🔺 = slower.

workflow with no steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)0.039s (+5.1% 🔺)1.014s (~)0.975s101.00x
🌐 StarterNext.js (Turbopack)0.040s (+8.6% 🔺)1.015s (~)0.974s101.03x
🌐 RedisNext.js (Turbopack)0.041s (+1.2%)1.017s (~)0.975s101.05x
💻 LocalExpress0.043s (-1.4%)1.007s (~)0.964s101.09x
💻 LocalNitro0.044s (~)1.006s (~)0.962s101.14x
🌐 TursoNext.js (Turbopack)0.102s (~)1.015s (~)0.913s102.60x
🌐 MongoDBNext.js (Turbopack)0.108s (+7.5% 🔺)1.014s (~)0.906s102.77x
🐘 PostgresExpress0.208s (-44.5% 🟢)1.014s (~)0.806s105.30x
🐘 PostgresNext.js (Turbopack)0.215s (-10.8% 🟢)1.019s (~)0.804s105.48x
🐘 PostgresNitro0.406s (+29.8% 🔺)1.012s (~)0.606s1010.35x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)0.535s (-11.0% 🟢)2.450s (+53.0% 🔺)1.914s101.00x
▲ VercelExpress0.635s (-16.3% 🟢)1.869s (+1.6%)1.234s101.19x
▲ VercelNitro0.725s (-35.1% 🟢)1.719s (-14.0% 🟢)0.994s101.35x

🔍 Observability: Next.js (Turbopack) | Express | Nitro

workflow with 1 step

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🌐 Starter🥇 Next.js (Turbopack)1.090s (~)2.010s (~)0.920s101.00x
💻 LocalNext.js (Turbopack)1.091s (-0.5%)2.011s (~)0.920s101.00x
🌐 RedisNext.js (Turbopack)1.107s (~)2.012s (~)0.905s101.02x
💻 LocalExpress1.110s (~)2.007s (~)0.896s101.02x
💻 LocalNitro1.114s (~)2.006s (~)0.892s101.02x
🌐 MongoDBNext.js (Turbopack)1.310s (~)2.012s (~)0.702s101.20x
🌐 TursoNext.js (Turbopack)1.310s (+0.7%)2.013s (~)0.703s101.20x
🐘 PostgresNext.js (Turbopack)1.639s (-10.8% 🟢)2.015s (~)0.376s101.50x
🐘 PostgresExpress2.260s (+1.3%)3.014s (~)0.754s102.07x
🐘 PostgresNitro2.285s (+7.7% 🔺)3.012s (~)0.727s102.10x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro2.680s (-3.0%)3.575s (-2.3%)0.896s101.00x
▲ VercelExpress3.185s (~)4.180s (+0.9%)0.995s101.19x
▲ VercelNext.js (Turbopack)3.223s (+17.8% 🔺)4.131s (+12.9% 🔺)0.908s101.20x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

workflow with 10 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🌐 Starter🥇 Next.js (Turbopack)10.627s (~)11.013s (~)0.385s51.00x
💻 LocalNext.js (Turbopack)10.667s (~)11.019s (~)0.352s51.00x
🌐 RedisNext.js (Turbopack)10.687s (~)11.019s (~)0.332s51.01x
💻 LocalExpress10.771s (~)11.012s (~)0.241s51.01x
💻 LocalNitro10.801s (~)11.012s (~)0.212s51.02x
🌐 MongoDBNext.js (Turbopack)12.178s (~)13.021s (~)0.842s51.15x
🌐 TursoNext.js (Turbopack)12.196s (~)13.038s (~)0.842s51.15x
🐘 PostgresNext.js (Turbopack)14.119s (-5.6% 🟢)14.429s (-7.7% 🟢)0.310s51.33x
🐘 PostgresNitro20.219s (-1.0%)21.040s (~)0.820s51.90x
🐘 PostgresExpress20.436s (+0.8%)21.032s (~)0.596s51.92x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro22.176s (-4.8%)23.160s (-2.6%)0.984s51.00x
▲ VercelExpress22.764s (-1.2%)23.376s (-0.9%)0.612s51.03x
▲ VercelNext.js (Turbopack)22.987s (~)23.791s (~)0.804s51.04x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

Promise.all with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🌐 Redis🥇 Next.js (Turbopack)1.363s (+0.9%)2.010s (~)0.647s151.00x
🌐 StarterNext.js (Turbopack)1.364s (+1.8%)2.008s (~)0.644s151.00x
💻 LocalNext.js (Turbopack)1.388s (-0.6%)2.012s (~)0.624s151.02x
💻 LocalExpress1.409s (+1.5%)2.006s (~)0.597s151.03x
💻 LocalNitro1.416s (~)2.005s (~)0.589s151.04x
🐘 PostgresNext.js (Turbopack)1.782s (+1.0%)2.016s (~)0.234s151.31x
🌐 MongoDBNext.js (Turbopack)2.127s (-1.3%)3.012s (~)0.886s101.56x
🌐 TursoNext.js (Turbopack)2.235s (+1.1%)3.016s (~)0.781s101.64x
🐘 PostgresExpress2.270s (+1.1%)3.013s (+6.5% 🔺)0.743s101.67x
🐘 PostgresNitro2.494s (+5.9% 🔺)3.012s (~)0.519s101.83x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express2.899s (-11.3% 🟢)3.762s (-8.6% 🟢)0.863s81.00x
▲ VercelNext.js (Turbopack)3.126s (-2.8%)3.818s (-5.4% 🟢)0.692s81.08x
▲ VercelNitro3.531s (+10.3% 🔺)4.461s (+16.6% 🔺)0.930s71.22x

🔍 Observability: Express | Next.js (Turbopack) | Nitro

Promise.all with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Express2.154s (~)3.125s (~)0.971s101.00x
💻 LocalNext.js (Turbopack)2.207s (+6.6% 🔺)3.153s (+11.2% 🔺)0.946s101.02x
💻 LocalNitro2.257s (+3.3%)3.195s (+2.3%)0.938s101.05x
🌐 StarterNext.js (Turbopack)2.481s (+1.8%)3.010s (~)0.529s101.15x
🌐 RedisNext.js (Turbopack)2.481s (~)3.013s (~)0.532s101.15x
🐘 PostgresNext.js (Turbopack)2.487s (-1.7%)3.017s (~)0.530s101.15x
🐘 PostgresNitro2.903s (-2.7%)3.012s (-10.2% 🟢)0.108s101.35x
🐘 PostgresExpress3.029s (+23.6% 🔺)3.583s (+19.0% 🔺)0.554s91.41x
🌐 MongoDBNext.js (Turbopack)4.617s (~)5.181s (~)0.564s62.14x
🌐 TursoNext.js (Turbopack)4.768s (+2.2%)5.184s (~)0.416s62.21x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro3.497s (-2.5%)3.933s (-19.4% 🟢)0.435s81.00x
▲ VercelExpress3.764s (-7.1% 🟢)4.574s (-2.9%)0.811s71.08x
▲ VercelNext.js (Turbopack)3.954s (+12.1% 🔺)4.614s (+4.4%)0.660s71.13x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

Promise.race with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🌐 Starter🥇 Next.js (Turbopack)1.380s (+2.1%)2.008s (~)0.628s151.00x
🌐 RedisNext.js (Turbopack)1.381s (+1.4%)2.010s (~)0.629s151.00x
💻 LocalNext.js (Turbopack)1.405s (+0.8%)2.013s (~)0.608s151.02x
💻 LocalExpress1.409s (+0.9%)2.006s (~)0.597s151.02x
💻 LocalNitro1.426s (+0.9%)2.005s (~)0.579s151.03x
🐘 PostgresNitro1.669s (-12.6% 🟢)2.010s (~)0.341s151.21x
🐘 PostgresNext.js (Turbopack)1.681s (~)2.012s (~)0.331s151.22x
🐘 PostgresExpress1.852s (+4.1%)2.009s (~)0.158s151.34x
🌐 MongoDBNext.js (Turbopack)2.178s (+1.4%)3.011s (~)0.833s101.58x
🌐 TursoNext.js (Turbopack)2.208s (~)3.014s (~)0.806s101.60x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro2.936s (+5.1% 🔺)3.642s (+1.0%)0.706s91.00x
▲ VercelExpress3.054s (+3.3%)3.979s (+3.1%)0.925s81.04x
▲ VercelNext.js (Turbopack)3.084s (+9.5% 🔺)3.870s (+3.8%)0.785s81.05x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

Promise.race with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Express2.208s (+1.2%)3.162s (~)0.954s101.00x
💻 LocalNext.js (Turbopack)2.244s (+3.7%)3.188s (+6.9% 🔺)0.944s101.02x
💻 LocalNitro2.250s (+1.8%)3.196s (+1.3%)0.946s101.02x
🌐 RedisNext.js (Turbopack)2.478s (+0.5%)3.014s (~)0.536s101.12x
🌐 StarterNext.js (Turbopack)2.518s (+1.9%)3.053s (+1.5%)0.535s101.14x
🐘 PostgresNext.js (Turbopack)2.554s (+2.6%)3.024s (~)0.471s101.16x
🐘 PostgresExpress2.556s (-1.4%)3.015s (~)0.460s101.16x
🐘 PostgresNitro2.881s (+8.8% 🔺)3.123s (+3.7%)0.242s101.30x
🌐 MongoDBNext.js (Turbopack)4.669s (-0.9%)5.180s (~)0.511s62.11x
🌐 TursoNext.js (Turbopack)4.803s (+3.7%)5.182s (~)0.379s62.17x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express3.200s (-15.6% 🟢)3.896s (-11.3% 🟢)0.696s81.00x
▲ VercelNext.js (Turbopack)3.438s (-6.0% 🟢)4.099s (-5.3% 🟢)0.661s81.07x
▲ VercelNitro3.752s (+10.3% 🔺)4.560s (+9.1% 🔺)0.808s71.17x

🔍 Observability: Express | Next.js (Turbopack) | Nitro

Stream Benchmarks(includes TTFB metrics)
workflow with stream

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🌐 Starter🥇 Next.js (Turbopack)0.141s (+12.4% 🔺)1.006s (~)0.000s (~)1.013s (~)0.871s101.00x
🌐 RedisNext.js (Turbopack)0.151s (+4.9%)1.005s (~)0.000s (+Infinity% 🔺)1.014s (~)0.864s101.07x
💻 LocalNext.js (Turbopack)0.151s (+8.3% 🔺)1.003s (~)0.017s (-2.8%)1.028s (~)0.877s101.07x
💻 LocalExpress0.175s (+0.6%)0.992s (~)0.018s (+11.4% 🔺)1.024s (~)0.849s101.24x
💻 LocalNitro0.182s (+2.9%)0.992s (~)0.016s (-2.4%)1.022s (~)0.840s101.29x
🌐 MongoDBNext.js (Turbopack)0.482s (-7.5% 🟢)0.964s (+3.8%)0.000s (+Infinity% 🔺)1.013s (~)0.530s103.41x
🌐 TursoNext.js (Turbopack)0.525s (+2.7%)0.930s (-0.7%)0.000s (NaN%)1.014s (~)0.489s103.72x
🐘 PostgresNext.js (Turbopack)0.696s (-41.2% 🟢)0.857s (-44.2% 🟢)0.000s (NaN%)1.016s (-41.2% 🟢)0.319s104.93x
🐘 PostgresExpress2.233s (-6.9% 🟢)2.809s (+6.2% 🔺)0.000s (NaN%)3.015s (~)0.781s1015.80x
🐘 PostgresNitro2.422s (+9.0% 🔺)2.621s (-7.2% 🟢)0.000s (-100.0% 🟢)3.013s (~)0.591s1017.14x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)2.743s (-12.9% 🟢)3.301s (-8.3% 🟢)0.547s (+10.5% 🔺)4.287s (-6.9% 🟢)1.543s101.00x
▲ VercelNitro2.838s (-2.5%)3.153s (-4.8%)0.390s (-10.5% 🟢)4.017s (-4.7%)1.179s101.03x
▲ VercelExpress2.964s (~)3.372s (+4.5%)0.471s (+16.9% 🔺)4.415s (+5.5% 🔺)1.452s101.08x

🔍 Observability: Next.js (Turbopack) | Nitro | Express

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World🥇 Fastest FrameworkWins
💻 LocalNext.js (Turbopack)6/8
🐘 PostgresNext.js (Turbopack)6/8
▲ VercelNitro4/8
Fastest World by Framework

Winner determined by most benchmark wins

Framework🥇 Fastest WorldWins
Express💻 Local8/8
Next.js (Turbopack)🌐 Starter4/8
Nitro💻 Local8/8
Column Definitions
  • Workflow Time: Runtime reported by workflow (completedAt - createdAt) - primary metric
  • TTFB: Time to First Byte - time from workflow start until first stream byte received (stream benchmarks only)
  • Slurp: Time from first byte to complete stream consumption (stream benchmarks only)
  • Wall Time: Total testbench time (trigger workflow + poll for result)
  • Overhead: Testbench overhead (Wall Time - Workflow Time)
  • Samples: Number of benchmark iterations run
  • vs Fastest: How much slower compared to the fastest configuration for this benchmark

Worlds:

  • 💻 Local: In-memory filesystem world (local development)
  • 🐘 Postgres: PostgreSQL database world (local development)
  • ▲ Vercel: Vercel production/preview deployment
  • 🌐 Starter: Community world (local development)
  • 🌐 Turso: Community world (local development)
  • 🌐 MongoDB: Community world (local development)
  • 🌐 Redis: Community world (local development)
  • 🌐 Jazz: Community world (local development)

📋 View full workflow run

Comment threadpackages/cli/src/lib/inspect/setup.ts Outdated
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
vercel[bot]

This comment was marked as resolved.

Comment threadpackages/cli/src/lib/update-check.ts
vercelBotand others added 5 commits December 30, 2025 10:10
…me using `createRequire` with a relative path. When bundled by Vite/SvelteKit for SSR, the relative path becomes invalid because the output file is at a different location than the source file, causing a MODULE_NOT_FOUND error. The fix uses `import.meta.resolve()` which provides correct path resolution even in bundled environments.
This commit fixes the issue reported at packages/world-local/src/init.ts:1-18
## SvelteKit build fails: Cannot find module '../package.json' in bundled SSR code
**What fails:** During SvelteKit SSR build, the `vite build` command fails with error: `Error: Cannot find module '../package.json'` in compiled code at `.svelte-kit/output/server/chunks/step-handler.js:1711:21`
**How to reproduce:**
```bash
cd workbench/sveltekit
pnpm run build
```
During the "rendering chunks" phase, when Vite bundles the SSR output, the compiled code attempts to require `../package.json` which fails because the relative path from the bundled output file location is invalid.
**Result:**
```
Error: Cannot find module '../package.json'
Require stack:
- /vercel/path0/workbench/sveltekit/.svelte-kit/output/server/chunks/step-handler.js
```
**Root cause:** The `packages/world-local/src/init.ts` file uses `createRequire(import.meta.url)` with a relative path `../package.json` to load the package.json file. When Rollup/Vite bundles this code for SSR, the relative path becomes invalid because the output file is at a different location than the source file.
**Solution:** Use `import.meta.resolve()` which provides proper module path resolution even in bundled environments. Falls back to `createRequire()` for compatibility with test environments where `import.meta.resolve()` may not be available.
Co-authored-by: Vercel <vercel[bot]@users.noreply.github.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Comment threadpackages/cli/src/lib/update-check.ts Outdated
VaguelySeriousand others added 4 commits January 2, 2026 14:40
Co-authored-by: vercel[bot] <35613825+vercel[bot]@users.noreply.github.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@VaguelySerious@pranaygp
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

[cli] Print notice on CLI startup when detecting an outdated version - #701

Merged
VaguelySerious merged 17 commits into
mainfrom
peter/cli-check-for-updates-manual
Jan 2, 2026
Merged

[cli] Print notice on CLI startup when detecting an outdated version#701
VaguelySerious merged 17 commits into
mainfrom
peter/cli-check-for-updates-manual

Conversation

@VaguelySerious

@VaguelySeriousVaguelySerious commented Dec 29, 2025

Copy link
Copy Markdown
Member

This superseeds #657, which tried to use an npm plugin for this job, but was ugly and didn't work with pre-release versions, so I had claude implement it instead.

Essentially:

  • First time you run the CLI it'll do a sync check to npm (failures being ignored) for new version, caching this for 3 days
  • Update note will be displayed in message header on every invocation in interactive mode, where we would usually just display the version
    • This might not be good enough for notifying users consistently. If this code seems good, I can extract it into utils, and also import it in the builder code to print during build in a shorter format.
  • Changing the package version busts the cache, so upgrading will reset the cache
  • i.e. also users who upgrade to latest won't see the "new version is available" note until at the earliest 3 day after that
  • The message may be off if someone installs @workflow/cli globally separately from workflow, since p i workflow@latest wouldn't resolve the update warning, but this seems like a minor concern.
image

Signed-off-by: Peter Wielander <mittgfu@gmail.com>
@vercel

vercelBot commented Dec 29, 2025

Copy link
Copy Markdown
Contributor

@changeset-bot

changeset-botBot commented Dec 29, 2025

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 3d0d66e

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

This PR includes changesets to release 4 packages
NameType
@workflow/cliPatch
workflowPatch
@workflow/world-testingPatch
@workflow/aiPatch

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

@github-actions

github-actionsBot commented Dec 29, 2025

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

Some tests failed

Summary

PassedFailedSkippedTotal
✅ ▲ Vercel Production308011319
✅ 💻 Local Development28208290
✅ 📦 Local Production28208290
✅ 🐘 Local Postgres28208290
✅ 🪟 Windows290029
❌ 🌍 Community Worlds117110128
Total130011351346

❌ Failed Tests

🌍 Community Worlds (11 failed)

mongodb (1 failed):

  • webhookWorkflow

starter (9 failed):

  • addTenWorkflow
  • addTenWorkflow
  • retryAttemptCounterWorkflow
  • crossFileErrorWorkflow - stack traces work across imported modules
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly

turso (1 failed):

  • webhookWorkflow

Details by Category

✅ ▲ Vercel Production
AppPassedFailedSkipped
✅ astro2801
✅ example2801
✅ express2801
✅ fastify2801
✅ hono2801
✅ nextjs-turbopack2801
✅ nextjs-webpack2801
✅ nitro2801
✅ nuxt2801
✅ sveltekit2801
✅ vite2801
✅ 💻 Local Development
AppPassedFailedSkipped
✅ astro-stable2801
✅ express-stable2801
✅ fastify-stable2801
✅ hono-stable2801
✅ nextjs-turbopack-stable2900
✅ nextjs-webpack-stable2900
✅ nitro-stable2801
✅ nuxt-stable2801
✅ sveltekit-stable2801
✅ vite-stable2801
✅ 📦 Local Production
AppPassedFailedSkipped
✅ astro-stable2801
✅ express-stable2801
✅ fastify-stable2801
✅ hono-stable2801
✅ nextjs-turbopack-stable2900
✅ nextjs-webpack-stable2900
✅ nitro-stable2801
✅ nuxt-stable2801
✅ sveltekit-stable2801
✅ vite-stable2801
✅ 🐘 Local Postgres
AppPassedFailedSkipped
✅ astro-stable2801
✅ express-stable2801
✅ fastify-stable2801
✅ hono-stable2801
✅ nextjs-turbopack-stable2900
✅ nextjs-webpack-stable2900
✅ nitro-stable2801
✅ nuxt-stable2801
✅ sveltekit-stable2801
✅ vite-stable2801
✅ 🪟 Windows
AppPassedFailedSkipped
✅ nextjs-turbopack2900
❌ 🌍 Community Worlds
AppPassedFailedSkipped
✅ mongodb-dev300
❌ mongodb2810
✅ redis-dev300
✅ redis2900
✅ starter-dev300
❌ starter2090
✅ turso-dev300
❌ turso2810

📋 View full workflow run

@github-actions

github-actionsBot commented Dec 29, 2025

Copy link
Copy Markdown
Contributor

📊 Benchmark Results

📈 Comparing against baseline from main branch. Green 🟢 = faster, Red 🔺 = slower.

workflow with no steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)0.039s (+5.1% 🔺)1.014s (~)0.975s101.00x
🌐 StarterNext.js (Turbopack)0.040s (+8.6% 🔺)1.015s (~)0.974s101.03x
🌐 RedisNext.js (Turbopack)0.041s (+1.2%)1.017s (~)0.975s101.05x
💻 LocalExpress0.043s (-1.4%)1.007s (~)0.964s101.09x
💻 LocalNitro0.044s (~)1.006s (~)0.962s101.14x
🌐 TursoNext.js (Turbopack)0.102s (~)1.015s (~)0.913s102.60x
🌐 MongoDBNext.js (Turbopack)0.108s (+7.5% 🔺)1.014s (~)0.906s102.77x
🐘 PostgresExpress0.208s (-44.5% 🟢)1.014s (~)0.806s105.30x
🐘 PostgresNext.js (Turbopack)0.215s (-10.8% 🟢)1.019s (~)0.804s105.48x
🐘 PostgresNitro0.406s (+29.8% 🔺)1.012s (~)0.606s1010.35x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)0.535s (-11.0% 🟢)2.450s (+53.0% 🔺)1.914s101.00x
▲ VercelExpress0.635s (-16.3% 🟢)1.869s (+1.6%)1.234s101.19x
▲ VercelNitro0.725s (-35.1% 🟢)1.719s (-14.0% 🟢)0.994s101.35x

🔍 Observability: Next.js (Turbopack) | Express | Nitro

workflow with 1 step

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🌐 Starter🥇 Next.js (Turbopack)1.090s (~)2.010s (~)0.920s101.00x
💻 LocalNext.js (Turbopack)1.091s (-0.5%)2.011s (~)0.920s101.00x
🌐 RedisNext.js (Turbopack)1.107s (~)2.012s (~)0.905s101.02x
💻 LocalExpress1.110s (~)2.007s (~)0.896s101.02x
💻 LocalNitro1.114s (~)2.006s (~)0.892s101.02x
🌐 MongoDBNext.js (Turbopack)1.310s (~)2.012s (~)0.702s101.20x
🌐 TursoNext.js (Turbopack)1.310s (+0.7%)2.013s (~)0.703s101.20x
🐘 PostgresNext.js (Turbopack)1.639s (-10.8% 🟢)2.015s (~)0.376s101.50x
🐘 PostgresExpress2.260s (+1.3%)3.014s (~)0.754s102.07x
🐘 PostgresNitro2.285s (+7.7% 🔺)3.012s (~)0.727s102.10x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro2.680s (-3.0%)3.575s (-2.3%)0.896s101.00x
▲ VercelExpress3.185s (~)4.180s (+0.9%)0.995s101.19x
▲ VercelNext.js (Turbopack)3.223s (+17.8% 🔺)4.131s (+12.9% 🔺)0.908s101.20x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

workflow with 10 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🌐 Starter🥇 Next.js (Turbopack)10.627s (~)11.013s (~)0.385s51.00x
💻 LocalNext.js (Turbopack)10.667s (~)11.019s (~)0.352s51.00x
🌐 RedisNext.js (Turbopack)10.687s (~)11.019s (~)0.332s51.01x
💻 LocalExpress10.771s (~)11.012s (~)0.241s51.01x
💻 LocalNitro10.801s (~)11.012s (~)0.212s51.02x
🌐 MongoDBNext.js (Turbopack)12.178s (~)13.021s (~)0.842s51.15x
🌐 TursoNext.js (Turbopack)12.196s (~)13.038s (~)0.842s51.15x
🐘 PostgresNext.js (Turbopack)14.119s (-5.6% 🟢)14.429s (-7.7% 🟢)0.310s51.33x
🐘 PostgresNitro20.219s (-1.0%)21.040s (~)0.820s51.90x
🐘 PostgresExpress20.436s (+0.8%)21.032s (~)0.596s51.92x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro22.176s (-4.8%)23.160s (-2.6%)0.984s51.00x
▲ VercelExpress22.764s (-1.2%)23.376s (-0.9%)0.612s51.03x
▲ VercelNext.js (Turbopack)22.987s (~)23.791s (~)0.804s51.04x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

Promise.all with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🌐 Redis🥇 Next.js (Turbopack)1.363s (+0.9%)2.010s (~)0.647s151.00x
🌐 StarterNext.js (Turbopack)1.364s (+1.8%)2.008s (~)0.644s151.00x
💻 LocalNext.js (Turbopack)1.388s (-0.6%)2.012s (~)0.624s151.02x
💻 LocalExpress1.409s (+1.5%)2.006s (~)0.597s151.03x
💻 LocalNitro1.416s (~)2.005s (~)0.589s151.04x
🐘 PostgresNext.js (Turbopack)1.782s (+1.0%)2.016s (~)0.234s151.31x
🌐 MongoDBNext.js (Turbopack)2.127s (-1.3%)3.012s (~)0.886s101.56x
🌐 TursoNext.js (Turbopack)2.235s (+1.1%)3.016s (~)0.781s101.64x
🐘 PostgresExpress2.270s (+1.1%)3.013s (+6.5% 🔺)0.743s101.67x
🐘 PostgresNitro2.494s (+5.9% 🔺)3.012s (~)0.519s101.83x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express2.899s (-11.3% 🟢)3.762s (-8.6% 🟢)0.863s81.00x
▲ VercelNext.js (Turbopack)3.126s (-2.8%)3.818s (-5.4% 🟢)0.692s81.08x
▲ VercelNitro3.531s (+10.3% 🔺)4.461s (+16.6% 🔺)0.930s71.22x

🔍 Observability: Express | Next.js (Turbopack) | Nitro

Promise.all with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Express2.154s (~)3.125s (~)0.971s101.00x
💻 LocalNext.js (Turbopack)2.207s (+6.6% 🔺)3.153s (+11.2% 🔺)0.946s101.02x
💻 LocalNitro2.257s (+3.3%)3.195s (+2.3%)0.938s101.05x
🌐 StarterNext.js (Turbopack)2.481s (+1.8%)3.010s (~)0.529s101.15x
🌐 RedisNext.js (Turbopack)2.481s (~)3.013s (~)0.532s101.15x
🐘 PostgresNext.js (Turbopack)2.487s (-1.7%)3.017s (~)0.530s101.15x
🐘 PostgresNitro2.903s (-2.7%)3.012s (-10.2% 🟢)0.108s101.35x
🐘 PostgresExpress3.029s (+23.6% 🔺)3.583s (+19.0% 🔺)0.554s91.41x
🌐 MongoDBNext.js (Turbopack)4.617s (~)5.181s (~)0.564s62.14x
🌐 TursoNext.js (Turbopack)4.768s (+2.2%)5.184s (~)0.416s62.21x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro3.497s (-2.5%)3.933s (-19.4% 🟢)0.435s81.00x
▲ VercelExpress3.764s (-7.1% 🟢)4.574s (-2.9%)0.811s71.08x
▲ VercelNext.js (Turbopack)3.954s (+12.1% 🔺)4.614s (+4.4%)0.660s71.13x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

Promise.race with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🌐 Starter🥇 Next.js (Turbopack)1.380s (+2.1%)2.008s (~)0.628s151.00x
🌐 RedisNext.js (Turbopack)1.381s (+1.4%)2.010s (~)0.629s151.00x
💻 LocalNext.js (Turbopack)1.405s (+0.8%)2.013s (~)0.608s151.02x
💻 LocalExpress1.409s (+0.9%)2.006s (~)0.597s151.02x
💻 LocalNitro1.426s (+0.9%)2.005s (~)0.579s151.03x
🐘 PostgresNitro1.669s (-12.6% 🟢)2.010s (~)0.341s151.21x
🐘 PostgresNext.js (Turbopack)1.681s (~)2.012s (~)0.331s151.22x
🐘 PostgresExpress1.852s (+4.1%)2.009s (~)0.158s151.34x
🌐 MongoDBNext.js (Turbopack)2.178s (+1.4%)3.011s (~)0.833s101.58x
🌐 TursoNext.js (Turbopack)2.208s (~)3.014s (~)0.806s101.60x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro2.936s (+5.1% 🔺)3.642s (+1.0%)0.706s91.00x
▲ VercelExpress3.054s (+3.3%)3.979s (+3.1%)0.925s81.04x
▲ VercelNext.js (Turbopack)3.084s (+9.5% 🔺)3.870s (+3.8%)0.785s81.05x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

Promise.race with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Express2.208s (+1.2%)3.162s (~)0.954s101.00x
💻 LocalNext.js (Turbopack)2.244s (+3.7%)3.188s (+6.9% 🔺)0.944s101.02x
💻 LocalNitro2.250s (+1.8%)3.196s (+1.3%)0.946s101.02x
🌐 RedisNext.js (Turbopack)2.478s (+0.5%)3.014s (~)0.536s101.12x
🌐 StarterNext.js (Turbopack)2.518s (+1.9%)3.053s (+1.5%)0.535s101.14x
🐘 PostgresNext.js (Turbopack)2.554s (+2.6%)3.024s (~)0.471s101.16x
🐘 PostgresExpress2.556s (-1.4%)3.015s (~)0.460s101.16x
🐘 PostgresNitro2.881s (+8.8% 🔺)3.123s (+3.7%)0.242s101.30x
🌐 MongoDBNext.js (Turbopack)4.669s (-0.9%)5.180s (~)0.511s62.11x
🌐 TursoNext.js (Turbopack)4.803s (+3.7%)5.182s (~)0.379s62.17x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express3.200s (-15.6% 🟢)3.896s (-11.3% 🟢)0.696s81.00x
▲ VercelNext.js (Turbopack)3.438s (-6.0% 🟢)4.099s (-5.3% 🟢)0.661s81.07x
▲ VercelNitro3.752s (+10.3% 🔺)4.560s (+9.1% 🔺)0.808s71.17x

🔍 Observability: Express | Next.js (Turbopack) | Nitro

Stream Benchmarks(includes TTFB metrics)
workflow with stream

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🌐 Starter🥇 Next.js (Turbopack)0.141s (+12.4% 🔺)1.006s (~)0.000s (~)1.013s (~)0.871s101.00x
🌐 RedisNext.js (Turbopack)0.151s (+4.9%)1.005s (~)0.000s (+Infinity% 🔺)1.014s (~)0.864s101.07x
💻 LocalNext.js (Turbopack)0.151s (+8.3% 🔺)1.003s (~)0.017s (-2.8%)1.028s (~)0.877s101.07x
💻 LocalExpress0.175s (+0.6%)0.992s (~)0.018s (+11.4% 🔺)1.024s (~)0.849s101.24x
💻 LocalNitro0.182s (+2.9%)0.992s (~)0.016s (-2.4%)1.022s (~)0.840s101.29x
🌐 MongoDBNext.js (Turbopack)0.482s (-7.5% 🟢)0.964s (+3.8%)0.000s (+Infinity% 🔺)1.013s (~)0.530s103.41x
🌐 TursoNext.js (Turbopack)0.525s (+2.7%)0.930s (-0.7%)0.000s (NaN%)1.014s (~)0.489s103.72x
🐘 PostgresNext.js (Turbopack)0.696s (-41.2% 🟢)0.857s (-44.2% 🟢)0.000s (NaN%)1.016s (-41.2% 🟢)0.319s104.93x
🐘 PostgresExpress2.233s (-6.9% 🟢)2.809s (+6.2% 🔺)0.000s (NaN%)3.015s (~)0.781s1015.80x
🐘 PostgresNitro2.422s (+9.0% 🔺)2.621s (-7.2% 🟢)0.000s (-100.0% 🟢)3.013s (~)0.591s1017.14x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)2.743s (-12.9% 🟢)3.301s (-8.3% 🟢)0.547s (+10.5% 🔺)4.287s (-6.9% 🟢)1.543s101.00x
▲ VercelNitro2.838s (-2.5%)3.153s (-4.8%)0.390s (-10.5% 🟢)4.017s (-4.7%)1.179s101.03x
▲ VercelExpress2.964s (~)3.372s (+4.5%)0.471s (+16.9% 🔺)4.415s (+5.5% 🔺)1.452s101.08x

🔍 Observability: Next.js (Turbopack) | Nitro | Express

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World🥇 Fastest FrameworkWins
💻 LocalNext.js (Turbopack)6/8
🐘 PostgresNext.js (Turbopack)6/8
▲ VercelNitro4/8
Fastest World by Framework

Winner determined by most benchmark wins

Framework🥇 Fastest WorldWins
Express💻 Local8/8
Next.js (Turbopack)🌐 Starter4/8
Nitro💻 Local8/8
Column Definitions
  • Workflow Time: Runtime reported by workflow (completedAt - createdAt) - primary metric
  • TTFB: Time to First Byte - time from workflow start until first stream byte received (stream benchmarks only)
  • Slurp: Time from first byte to complete stream consumption (stream benchmarks only)
  • Wall Time: Total testbench time (trigger workflow + poll for result)
  • Overhead: Testbench overhead (Wall Time - Workflow Time)
  • Samples: Number of benchmark iterations run
  • vs Fastest: How much slower compared to the fastest configuration for this benchmark

Worlds:

  • 💻 Local: In-memory filesystem world (local development)
  • 🐘 Postgres: PostgreSQL database world (local development)
  • ▲ Vercel: Vercel production/preview deployment
  • 🌐 Starter: Community world (local development)
  • 🌐 Turso: Community world (local development)
  • 🌐 MongoDB: Community world (local development)
  • 🌐 Redis: Community world (local development)
  • 🌐 Jazz: Community world (local development)

📋 View full workflow run

Comment threadpackages/cli/src/lib/inspect/setup.ts Outdated
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
vercel[bot]

This comment was marked as resolved.

Comment threadpackages/cli/src/lib/update-check.ts
vercelBotand others added 5 commits December 30, 2025 10:10
…me using `createRequire` with a relative path. When bundled by Vite/SvelteKit for SSR, the relative path becomes invalid because the output file is at a different location than the source file, causing a MODULE_NOT_FOUND error. The fix uses `import.meta.resolve()` which provides correct path resolution even in bundled environments.
This commit fixes the issue reported at packages/world-local/src/init.ts:1-18
## SvelteKit build fails: Cannot find module '../package.json' in bundled SSR code
**What fails:** During SvelteKit SSR build, the `vite build` command fails with error: `Error: Cannot find module '../package.json'` in compiled code at `.svelte-kit/output/server/chunks/step-handler.js:1711:21`
**How to reproduce:**
```bash
cd workbench/sveltekit
pnpm run build
```
During the "rendering chunks" phase, when Vite bundles the SSR output, the compiled code attempts to require `../package.json` which fails because the relative path from the bundled output file location is invalid.
**Result:**
```
Error: Cannot find module '../package.json'
Require stack:
- /vercel/path0/workbench/sveltekit/.svelte-kit/output/server/chunks/step-handler.js
```
**Root cause:** The `packages/world-local/src/init.ts` file uses `createRequire(import.meta.url)` with a relative path `../package.json` to load the package.json file. When Rollup/Vite bundles this code for SSR, the relative path becomes invalid because the output file is at a different location than the source file.
**Solution:** Use `import.meta.resolve()` which provides proper module path resolution even in bundled environments. Falls back to `createRequire()` for compatibility with test environments where `import.meta.resolve()` may not be available.
Co-authored-by: Vercel <vercel[bot]@users.noreply.github.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Comment threadpackages/cli/src/lib/update-check.ts Outdated
VaguelySeriousand others added 4 commits January 2, 2026 14:40
Co-authored-by: vercel[bot] <35613825+vercel[bot]@users.noreply.github.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@VaguelySerious@pranaygp
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[cli] Print notice on CLI startup when detecting an outdated version - #701

Merged
VaguelySerious merged 17 commits into
mainfrom
peter/cli-check-for-updates-manual
Jan 2, 2026
Merged

[cli] Print notice on CLI startup when detecting an outdated version#701
VaguelySerious merged 17 commits into
mainfrom
peter/cli-check-for-updates-manual

Conversation

@VaguelySerious

@VaguelySeriousVaguelySerious commented Dec 29, 2025

Copy link
Copy Markdown
Member

This superseeds #657, which tried to use an npm plugin for this job, but was ugly and didn't work with pre-release versions, so I had claude implement it instead.

Essentially:

  • First time you run the CLI it'll do a sync check to npm (failures being ignored) for new version, caching this for 3 days
  • Update note will be displayed in message header on every invocation in interactive mode, where we would usually just display the version
    • This might not be good enough for notifying users consistently. If this code seems good, I can extract it into utils, and also import it in the builder code to print during build in a shorter format.
  • Changing the package version busts the cache, so upgrading will reset the cache
  • i.e. also users who upgrade to latest won't see the "new version is available" note until at the earliest 3 day after that
  • The message may be off if someone installs @workflow/cli globally separately from workflow, since p i workflow@latest wouldn't resolve the update warning, but this seems like a minor concern.
image

Signed-off-by: Peter Wielander <mittgfu@gmail.com>
@vercel

vercelBot commented Dec 29, 2025

Copy link
Copy Markdown
Contributor

@changeset-bot

changeset-botBot commented Dec 29, 2025

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 3d0d66e

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

This PR includes changesets to release 4 packages
NameType
@workflow/cliPatch
workflowPatch
@workflow/world-testingPatch
@workflow/aiPatch

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

@github-actions

github-actionsBot commented Dec 29, 2025

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

Some tests failed

Summary

PassedFailedSkippedTotal
✅ ▲ Vercel Production308011319
✅ 💻 Local Development28208290
✅ 📦 Local Production28208290
✅ 🐘 Local Postgres28208290
✅ 🪟 Windows290029
❌ 🌍 Community Worlds117110128
Total130011351346

❌ Failed Tests

🌍 Community Worlds (11 failed)

mongodb (1 failed):

  • webhookWorkflow

starter (9 failed):

  • addTenWorkflow
  • addTenWorkflow
  • retryAttemptCounterWorkflow
  • crossFileErrorWorkflow - stack traces work across imported modules
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly

turso (1 failed):

  • webhookWorkflow

Details by Category

✅ ▲ Vercel Production
AppPassedFailedSkipped
✅ astro2801
✅ example2801
✅ express2801
✅ fastify2801
✅ hono2801
✅ nextjs-turbopack2801
✅ nextjs-webpack2801
✅ nitro2801
✅ nuxt2801
✅ sveltekit2801
✅ vite2801
✅ 💻 Local Development
AppPassedFailedSkipped
✅ astro-stable2801
✅ express-stable2801
✅ fastify-stable2801
✅ hono-stable2801
✅ nextjs-turbopack-stable2900
✅ nextjs-webpack-stable2900
✅ nitro-stable2801
✅ nuxt-stable2801
✅ sveltekit-stable2801
✅ vite-stable2801
✅ 📦 Local Production
AppPassedFailedSkipped
✅ astro-stable2801
✅ express-stable2801
✅ fastify-stable2801
✅ hono-stable2801
✅ nextjs-turbopack-stable2900
✅ nextjs-webpack-stable2900
✅ nitro-stable2801
✅ nuxt-stable2801
✅ sveltekit-stable2801
✅ vite-stable2801
✅ 🐘 Local Postgres
AppPassedFailedSkipped
✅ astro-stable2801
✅ express-stable2801
✅ fastify-stable2801
✅ hono-stable2801
✅ nextjs-turbopack-stable2900
✅ nextjs-webpack-stable2900
✅ nitro-stable2801
✅ nuxt-stable2801
✅ sveltekit-stable2801
✅ vite-stable2801
✅ 🪟 Windows
AppPassedFailedSkipped
✅ nextjs-turbopack2900
❌ 🌍 Community Worlds
AppPassedFailedSkipped
✅ mongodb-dev300
❌ mongodb2810
✅ redis-dev300
✅ redis2900
✅ starter-dev300
❌ starter2090
✅ turso-dev300
❌ turso2810

📋 View full workflow run

@github-actions

github-actionsBot commented Dec 29, 2025

Copy link
Copy Markdown
Contributor

📊 Benchmark Results

📈 Comparing against baseline from main branch. Green 🟢 = faster, Red 🔺 = slower.

workflow with no steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)0.039s (+5.1% 🔺)1.014s (~)0.975s101.00x
🌐 StarterNext.js (Turbopack)0.040s (+8.6% 🔺)1.015s (~)0.974s101.03x
🌐 RedisNext.js (Turbopack)0.041s (+1.2%)1.017s (~)0.975s101.05x
💻 LocalExpress0.043s (-1.4%)1.007s (~)0.964s101.09x
💻 LocalNitro0.044s (~)1.006s (~)0.962s101.14x
🌐 TursoNext.js (Turbopack)0.102s (~)1.015s (~)0.913s102.60x
🌐 MongoDBNext.js (Turbopack)0.108s (+7.5% 🔺)1.014s (~)0.906s102.77x
🐘 PostgresExpress0.208s (-44.5% 🟢)1.014s (~)0.806s105.30x
🐘 PostgresNext.js (Turbopack)0.215s (-10.8% 🟢)1.019s (~)0.804s105.48x
🐘 PostgresNitro0.406s (+29.8% 🔺)1.012s (~)0.606s1010.35x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)0.535s (-11.0% 🟢)2.450s (+53.0% 🔺)1.914s101.00x
▲ VercelExpress0.635s (-16.3% 🟢)1.869s (+1.6%)1.234s101.19x
▲ VercelNitro0.725s (-35.1% 🟢)1.719s (-14.0% 🟢)0.994s101.35x

🔍 Observability: Next.js (Turbopack) | Express | Nitro

workflow with 1 step

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🌐 Starter🥇 Next.js (Turbopack)1.090s (~)2.010s (~)0.920s101.00x
💻 LocalNext.js (Turbopack)1.091s (-0.5%)2.011s (~)0.920s101.00x
🌐 RedisNext.js (Turbopack)1.107s (~)2.012s (~)0.905s101.02x
💻 LocalExpress1.110s (~)2.007s (~)0.896s101.02x
💻 LocalNitro1.114s (~)2.006s (~)0.892s101.02x
🌐 MongoDBNext.js (Turbopack)1.310s (~)2.012s (~)0.702s101.20x
🌐 TursoNext.js (Turbopack)1.310s (+0.7%)2.013s (~)0.703s101.20x
🐘 PostgresNext.js (Turbopack)1.639s (-10.8% 🟢)2.015s (~)0.376s101.50x
🐘 PostgresExpress2.260s (+1.3%)3.014s (~)0.754s102.07x
🐘 PostgresNitro2.285s (+7.7% 🔺)3.012s (~)0.727s102.10x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro2.680s (-3.0%)3.575s (-2.3%)0.896s101.00x
▲ VercelExpress3.185s (~)4.180s (+0.9%)0.995s101.19x
▲ VercelNext.js (Turbopack)3.223s (+17.8% 🔺)4.131s (+12.9% 🔺)0.908s101.20x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

workflow with 10 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🌐 Starter🥇 Next.js (Turbopack)10.627s (~)11.013s (~)0.385s51.00x
💻 LocalNext.js (Turbopack)10.667s (~)11.019s (~)0.352s51.00x
🌐 RedisNext.js (Turbopack)10.687s (~)11.019s (~)0.332s51.01x
💻 LocalExpress10.771s (~)11.012s (~)0.241s51.01x
💻 LocalNitro10.801s (~)11.012s (~)0.212s51.02x
🌐 MongoDBNext.js (Turbopack)12.178s (~)13.021s (~)0.842s51.15x
🌐 TursoNext.js (Turbopack)12.196s (~)13.038s (~)0.842s51.15x
🐘 PostgresNext.js (Turbopack)14.119s (-5.6% 🟢)14.429s (-7.7% 🟢)0.310s51.33x
🐘 PostgresNitro20.219s (-1.0%)21.040s (~)0.820s51.90x
🐘 PostgresExpress20.436s (+0.8%)21.032s (~)0.596s51.92x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro22.176s (-4.8%)23.160s (-2.6%)0.984s51.00x
▲ VercelExpress22.764s (-1.2%)23.376s (-0.9%)0.612s51.03x
▲ VercelNext.js (Turbopack)22.987s (~)23.791s (~)0.804s51.04x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

Promise.all with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🌐 Redis🥇 Next.js (Turbopack)1.363s (+0.9%)2.010s (~)0.647s151.00x
🌐 StarterNext.js (Turbopack)1.364s (+1.8%)2.008s (~)0.644s151.00x
💻 LocalNext.js (Turbopack)1.388s (-0.6%)2.012s (~)0.624s151.02x
💻 LocalExpress1.409s (+1.5%)2.006s (~)0.597s151.03x
💻 LocalNitro1.416s (~)2.005s (~)0.589s151.04x
🐘 PostgresNext.js (Turbopack)1.782s (+1.0%)2.016s (~)0.234s151.31x
🌐 MongoDBNext.js (Turbopack)2.127s (-1.3%)3.012s (~)0.886s101.56x
🌐 TursoNext.js (Turbopack)2.235s (+1.1%)3.016s (~)0.781s101.64x
🐘 PostgresExpress2.270s (+1.1%)3.013s (+6.5% 🔺)0.743s101.67x
🐘 PostgresNitro2.494s (+5.9% 🔺)3.012s (~)0.519s101.83x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express2.899s (-11.3% 🟢)3.762s (-8.6% 🟢)0.863s81.00x
▲ VercelNext.js (Turbopack)3.126s (-2.8%)3.818s (-5.4% 🟢)0.692s81.08x
▲ VercelNitro3.531s (+10.3% 🔺)4.461s (+16.6% 🔺)0.930s71.22x

🔍 Observability: Express | Next.js (Turbopack) | Nitro

Promise.all with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Express2.154s (~)3.125s (~)0.971s101.00x
💻 LocalNext.js (Turbopack)2.207s (+6.6% 🔺)3.153s (+11.2% 🔺)0.946s101.02x
💻 LocalNitro2.257s (+3.3%)3.195s (+2.3%)0.938s101.05x
🌐 StarterNext.js (Turbopack)2.481s (+1.8%)3.010s (~)0.529s101.15x
🌐 RedisNext.js (Turbopack)2.481s (~)3.013s (~)0.532s101.15x
🐘 PostgresNext.js (Turbopack)2.487s (-1.7%)3.017s (~)0.530s101.15x
🐘 PostgresNitro2.903s (-2.7%)3.012s (-10.2% 🟢)0.108s101.35x
🐘 PostgresExpress3.029s (+23.6% 🔺)3.583s (+19.0% 🔺)0.554s91.41x
🌐 MongoDBNext.js (Turbopack)4.617s (~)5.181s (~)0.564s62.14x
🌐 TursoNext.js (Turbopack)4.768s (+2.2%)5.184s (~)0.416s62.21x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro3.497s (-2.5%)3.933s (-19.4% 🟢)0.435s81.00x
▲ VercelExpress3.764s (-7.1% 🟢)4.574s (-2.9%)0.811s71.08x
▲ VercelNext.js (Turbopack)3.954s (+12.1% 🔺)4.614s (+4.4%)0.660s71.13x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

Promise.race with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🌐 Starter🥇 Next.js (Turbopack)1.380s (+2.1%)2.008s (~)0.628s151.00x
🌐 RedisNext.js (Turbopack)1.381s (+1.4%)2.010s (~)0.629s151.00x
💻 LocalNext.js (Turbopack)1.405s (+0.8%)2.013s (~)0.608s151.02x
💻 LocalExpress1.409s (+0.9%)2.006s (~)0.597s151.02x
💻 LocalNitro1.426s (+0.9%)2.005s (~)0.579s151.03x
🐘 PostgresNitro1.669s (-12.6% 🟢)2.010s (~)0.341s151.21x
🐘 PostgresNext.js (Turbopack)1.681s (~)2.012s (~)0.331s151.22x
🐘 PostgresExpress1.852s (+4.1%)2.009s (~)0.158s151.34x
🌐 MongoDBNext.js (Turbopack)2.178s (+1.4%)3.011s (~)0.833s101.58x
🌐 TursoNext.js (Turbopack)2.208s (~)3.014s (~)0.806s101.60x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro2.936s (+5.1% 🔺)3.642s (+1.0%)0.706s91.00x
▲ VercelExpress3.054s (+3.3%)3.979s (+3.1%)0.925s81.04x
▲ VercelNext.js (Turbopack)3.084s (+9.5% 🔺)3.870s (+3.8%)0.785s81.05x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

Promise.race with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Express2.208s (+1.2%)3.162s (~)0.954s101.00x
💻 LocalNext.js (Turbopack)2.244s (+3.7%)3.188s (+6.9% 🔺)0.944s101.02x
💻 LocalNitro2.250s (+1.8%)3.196s (+1.3%)0.946s101.02x
🌐 RedisNext.js (Turbopack)2.478s (+0.5%)3.014s (~)0.536s101.12x
🌐 StarterNext.js (Turbopack)2.518s (+1.9%)3.053s (+1.5%)0.535s101.14x
🐘 PostgresNext.js (Turbopack)2.554s (+2.6%)3.024s (~)0.471s101.16x
🐘 PostgresExpress2.556s (-1.4%)3.015s (~)0.460s101.16x
🐘 PostgresNitro2.881s (+8.8% 🔺)3.123s (+3.7%)0.242s101.30x
🌐 MongoDBNext.js (Turbopack)4.669s (-0.9%)5.180s (~)0.511s62.11x
🌐 TursoNext.js (Turbopack)4.803s (+3.7%)5.182s (~)0.379s62.17x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express3.200s (-15.6% 🟢)3.896s (-11.3% 🟢)0.696s81.00x
▲ VercelNext.js (Turbopack)3.438s (-6.0% 🟢)4.099s (-5.3% 🟢)0.661s81.07x
▲ VercelNitro3.752s (+10.3% 🔺)4.560s (+9.1% 🔺)0.808s71.17x

🔍 Observability: Express | Next.js (Turbopack) | Nitro

Stream Benchmarks(includes TTFB metrics)
workflow with stream

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🌐 Starter🥇 Next.js (Turbopack)0.141s (+12.4% 🔺)1.006s (~)0.000s (~)1.013s (~)0.871s101.00x
🌐 RedisNext.js (Turbopack)0.151s (+4.9%)1.005s (~)0.000s (+Infinity% 🔺)1.014s (~)0.864s101.07x
💻 LocalNext.js (Turbopack)0.151s (+8.3% 🔺)1.003s (~)0.017s (-2.8%)1.028s (~)0.877s101.07x
💻 LocalExpress0.175s (+0.6%)0.992s (~)0.018s (+11.4% 🔺)1.024s (~)0.849s101.24x
💻 LocalNitro0.182s (+2.9%)0.992s (~)0.016s (-2.4%)1.022s (~)0.840s101.29x
🌐 MongoDBNext.js (Turbopack)0.482s (-7.5% 🟢)0.964s (+3.8%)0.000s (+Infinity% 🔺)1.013s (~)0.530s103.41x
🌐 TursoNext.js (Turbopack)0.525s (+2.7%)0.930s (-0.7%)0.000s (NaN%)1.014s (~)0.489s103.72x
🐘 PostgresNext.js (Turbopack)0.696s (-41.2% 🟢)0.857s (-44.2% 🟢)0.000s (NaN%)1.016s (-41.2% 🟢)0.319s104.93x
🐘 PostgresExpress2.233s (-6.9% 🟢)2.809s (+6.2% 🔺)0.000s (NaN%)3.015s (~)0.781s1015.80x
🐘 PostgresNitro2.422s (+9.0% 🔺)2.621s (-7.2% 🟢)0.000s (-100.0% 🟢)3.013s (~)0.591s1017.14x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)2.743s (-12.9% 🟢)3.301s (-8.3% 🟢)0.547s (+10.5% 🔺)4.287s (-6.9% 🟢)1.543s101.00x
▲ VercelNitro2.838s (-2.5%)3.153s (-4.8%)0.390s (-10.5% 🟢)4.017s (-4.7%)1.179s101.03x
▲ VercelExpress2.964s (~)3.372s (+4.5%)0.471s (+16.9% 🔺)4.415s (+5.5% 🔺)1.452s101.08x

🔍 Observability: Next.js (Turbopack) | Nitro | Express

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World🥇 Fastest FrameworkWins
💻 LocalNext.js (Turbopack)6/8
🐘 PostgresNext.js (Turbopack)6/8
▲ VercelNitro4/8
Fastest World by Framework

Winner determined by most benchmark wins

Framework🥇 Fastest WorldWins
Express💻 Local8/8
Next.js (Turbopack)🌐 Starter4/8
Nitro💻 Local8/8
Column Definitions
  • Workflow Time: Runtime reported by workflow (completedAt - createdAt) - primary metric
  • TTFB: Time to First Byte - time from workflow start until first stream byte received (stream benchmarks only)
  • Slurp: Time from first byte to complete stream consumption (stream benchmarks only)
  • Wall Time: Total testbench time (trigger workflow + poll for result)
  • Overhead: Testbench overhead (Wall Time - Workflow Time)
  • Samples: Number of benchmark iterations run
  • vs Fastest: How much slower compared to the fastest configuration for this benchmark

Worlds:

  • 💻 Local: In-memory filesystem world (local development)
  • 🐘 Postgres: PostgreSQL database world (local development)
  • ▲ Vercel: Vercel production/preview deployment
  • 🌐 Starter: Community world (local development)
  • 🌐 Turso: Community world (local development)
  • 🌐 MongoDB: Community world (local development)
  • 🌐 Redis: Community world (local development)
  • 🌐 Jazz: Community world (local development)

📋 View full workflow run

Comment threadpackages/cli/src/lib/inspect/setup.ts Outdated
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
vercel[bot]

This comment was marked as resolved.

Comment threadpackages/cli/src/lib/update-check.ts
vercelBotand others added 5 commits December 30, 2025 10:10
…me using `createRequire` with a relative path. When bundled by Vite/SvelteKit for SSR, the relative path becomes invalid because the output file is at a different location than the source file, causing a MODULE_NOT_FOUND error. The fix uses `import.meta.resolve()` which provides correct path resolution even in bundled environments.
This commit fixes the issue reported at packages/world-local/src/init.ts:1-18
## SvelteKit build fails: Cannot find module '../package.json' in bundled SSR code
**What fails:** During SvelteKit SSR build, the `vite build` command fails with error: `Error: Cannot find module '../package.json'` in compiled code at `.svelte-kit/output/server/chunks/step-handler.js:1711:21`
**How to reproduce:**
```bash
cd workbench/sveltekit
pnpm run build
```
During the "rendering chunks" phase, when Vite bundles the SSR output, the compiled code attempts to require `../package.json` which fails because the relative path from the bundled output file location is invalid.
**Result:**
```
Error: Cannot find module '../package.json'
Require stack:
- /vercel/path0/workbench/sveltekit/.svelte-kit/output/server/chunks/step-handler.js
```
**Root cause:** The `packages/world-local/src/init.ts` file uses `createRequire(import.meta.url)` with a relative path `../package.json` to load the package.json file. When Rollup/Vite bundles this code for SSR, the relative path becomes invalid because the output file is at a different location than the source file.
**Solution:** Use `import.meta.resolve()` which provides proper module path resolution even in bundled environments. Falls back to `createRequire()` for compatibility with test environments where `import.meta.resolve()` may not be available.
Co-authored-by: Vercel <vercel[bot]@users.noreply.github.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Comment threadpackages/cli/src/lib/update-check.ts Outdated
VaguelySeriousand others added 4 commits January 2, 2026 14:40
Co-authored-by: vercel[bot] <35613825+vercel[bot]@users.noreply.github.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@VaguelySerious@pranaygp
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[cli] Print notice on CLI startup when detecting an outdated version - #701

Merged
VaguelySerious merged 17 commits into
mainfrom
peter/cli-check-for-updates-manual
Jan 2, 2026
Merged

[cli] Print notice on CLI startup when detecting an outdated version#701
VaguelySerious merged 17 commits into
mainfrom
peter/cli-check-for-updates-manual

Conversation

@VaguelySerious

@VaguelySeriousVaguelySerious commented Dec 29, 2025

Copy link
Copy Markdown
Member

This superseeds #657, which tried to use an npm plugin for this job, but was ugly and didn't work with pre-release versions, so I had claude implement it instead.

Essentially:

  • First time you run the CLI it'll do a sync check to npm (failures being ignored) for new version, caching this for 3 days
  • Update note will be displayed in message header on every invocation in interactive mode, where we would usually just display the version
    • This might not be good enough for notifying users consistently. If this code seems good, I can extract it into utils, and also import it in the builder code to print during build in a shorter format.
  • Changing the package version busts the cache, so upgrading will reset the cache
  • i.e. also users who upgrade to latest won't see the "new version is available" note until at the earliest 3 day after that
  • The message may be off if someone installs @workflow/cli globally separately from workflow, since p i workflow@latest wouldn't resolve the update warning, but this seems like a minor concern.
image

Signed-off-by: Peter Wielander <mittgfu@gmail.com>
@vercel

vercelBot commented Dec 29, 2025

Copy link
Copy Markdown
Contributor

@changeset-bot

changeset-botBot commented Dec 29, 2025

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 3d0d66e

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

This PR includes changesets to release 4 packages
NameType
@workflow/cliPatch
workflowPatch
@workflow/world-testingPatch
@workflow/aiPatch

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

@github-actions

github-actionsBot commented Dec 29, 2025

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

Some tests failed

Summary

PassedFailedSkippedTotal
✅ ▲ Vercel Production308011319
✅ 💻 Local Development28208290
✅ 📦 Local Production28208290
✅ 🐘 Local Postgres28208290
✅ 🪟 Windows290029
❌ 🌍 Community Worlds117110128
Total130011351346

❌ Failed Tests

🌍 Community Worlds (11 failed)

mongodb (1 failed):

  • webhookWorkflow

starter (9 failed):

  • addTenWorkflow
  • addTenWorkflow
  • retryAttemptCounterWorkflow
  • crossFileErrorWorkflow - stack traces work across imported modules
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly

turso (1 failed):

  • webhookWorkflow

Details by Category

✅ ▲ Vercel Production
AppPassedFailedSkipped
✅ astro2801
✅ example2801
✅ express2801
✅ fastify2801
✅ hono2801
✅ nextjs-turbopack2801
✅ nextjs-webpack2801
✅ nitro2801
✅ nuxt2801
✅ sveltekit2801
✅ vite2801
✅ 💻 Local Development
AppPassedFailedSkipped
✅ astro-stable2801
✅ express-stable2801
✅ fastify-stable2801
✅ hono-stable2801
✅ nextjs-turbopack-stable2900
✅ nextjs-webpack-stable2900
✅ nitro-stable2801
✅ nuxt-stable2801
✅ sveltekit-stable2801
✅ vite-stable2801
✅ 📦 Local Production
AppPassedFailedSkipped
✅ astro-stable2801
✅ express-stable2801
✅ fastify-stable2801
✅ hono-stable2801
✅ nextjs-turbopack-stable2900
✅ nextjs-webpack-stable2900
✅ nitro-stable2801
✅ nuxt-stable2801
✅ sveltekit-stable2801
✅ vite-stable2801
✅ 🐘 Local Postgres
AppPassedFailedSkipped
✅ astro-stable2801
✅ express-stable2801
✅ fastify-stable2801
✅ hono-stable2801
✅ nextjs-turbopack-stable2900
✅ nextjs-webpack-stable2900
✅ nitro-stable2801
✅ nuxt-stable2801
✅ sveltekit-stable2801
✅ vite-stable2801
✅ 🪟 Windows
AppPassedFailedSkipped
✅ nextjs-turbopack2900
❌ 🌍 Community Worlds
AppPassedFailedSkipped
✅ mongodb-dev300
❌ mongodb2810
✅ redis-dev300
✅ redis2900
✅ starter-dev300
❌ starter2090
✅ turso-dev300
❌ turso2810

📋 View full workflow run

@github-actions

github-actionsBot commented Dec 29, 2025

Copy link
Copy Markdown
Contributor

📊 Benchmark Results

📈 Comparing against baseline from main branch. Green 🟢 = faster, Red 🔺 = slower.

workflow with no steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)0.039s (+5.1% 🔺)1.014s (~)0.975s101.00x
🌐 StarterNext.js (Turbopack)0.040s (+8.6% 🔺)1.015s (~)0.974s101.03x
🌐 RedisNext.js (Turbopack)0.041s (+1.2%)1.017s (~)0.975s101.05x
💻 LocalExpress0.043s (-1.4%)1.007s (~)0.964s101.09x
💻 LocalNitro0.044s (~)1.006s (~)0.962s101.14x
🌐 TursoNext.js (Turbopack)0.102s (~)1.015s (~)0.913s102.60x
🌐 MongoDBNext.js (Turbopack)0.108s (+7.5% 🔺)1.014s (~)0.906s102.77x
🐘 PostgresExpress0.208s (-44.5% 🟢)1.014s (~)0.806s105.30x
🐘 PostgresNext.js (Turbopack)0.215s (-10.8% 🟢)1.019s (~)0.804s105.48x
🐘 PostgresNitro0.406s (+29.8% 🔺)1.012s (~)0.606s1010.35x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)0.535s (-11.0% 🟢)2.450s (+53.0% 🔺)1.914s101.00x
▲ VercelExpress0.635s (-16.3% 🟢)1.869s (+1.6%)1.234s101.19x
▲ VercelNitro0.725s (-35.1% 🟢)1.719s (-14.0% 🟢)0.994s101.35x

🔍 Observability: Next.js (Turbopack) | Express | Nitro

workflow with 1 step

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🌐 Starter🥇 Next.js (Turbopack)1.090s (~)2.010s (~)0.920s101.00x
💻 LocalNext.js (Turbopack)1.091s (-0.5%)2.011s (~)0.920s101.00x
🌐 RedisNext.js (Turbopack)1.107s (~)2.012s (~)0.905s101.02x
💻 LocalExpress1.110s (~)2.007s (~)0.896s101.02x
💻 LocalNitro1.114s (~)2.006s (~)0.892s101.02x
🌐 MongoDBNext.js (Turbopack)1.310s (~)2.012s (~)0.702s101.20x
🌐 TursoNext.js (Turbopack)1.310s (+0.7%)2.013s (~)0.703s101.20x
🐘 PostgresNext.js (Turbopack)1.639s (-10.8% 🟢)2.015s (~)0.376s101.50x
🐘 PostgresExpress2.260s (+1.3%)3.014s (~)0.754s102.07x
🐘 PostgresNitro2.285s (+7.7% 🔺)3.012s (~)0.727s102.10x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro2.680s (-3.0%)3.575s (-2.3%)0.896s101.00x
▲ VercelExpress3.185s (~)4.180s (+0.9%)0.995s101.19x
▲ VercelNext.js (Turbopack)3.223s (+17.8% 🔺)4.131s (+12.9% 🔺)0.908s101.20x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

workflow with 10 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🌐 Starter🥇 Next.js (Turbopack)10.627s (~)11.013s (~)0.385s51.00x
💻 LocalNext.js (Turbopack)10.667s (~)11.019s (~)0.352s51.00x
🌐 RedisNext.js (Turbopack)10.687s (~)11.019s (~)0.332s51.01x
💻 LocalExpress10.771s (~)11.012s (~)0.241s51.01x
💻 LocalNitro10.801s (~)11.012s (~)0.212s51.02x
🌐 MongoDBNext.js (Turbopack)12.178s (~)13.021s (~)0.842s51.15x
🌐 TursoNext.js (Turbopack)12.196s (~)13.038s (~)0.842s51.15x
🐘 PostgresNext.js (Turbopack)14.119s (-5.6% 🟢)14.429s (-7.7% 🟢)0.310s51.33x
🐘 PostgresNitro20.219s (-1.0%)21.040s (~)0.820s51.90x
🐘 PostgresExpress20.436s (+0.8%)21.032s (~)0.596s51.92x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro22.176s (-4.8%)23.160s (-2.6%)0.984s51.00x
▲ VercelExpress22.764s (-1.2%)23.376s (-0.9%)0.612s51.03x
▲ VercelNext.js (Turbopack)22.987s (~)23.791s (~)0.804s51.04x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

Promise.all with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🌐 Redis🥇 Next.js (Turbopack)1.363s (+0.9%)2.010s (~)0.647s151.00x
🌐 StarterNext.js (Turbopack)1.364s (+1.8%)2.008s (~)0.644s151.00x
💻 LocalNext.js (Turbopack)1.388s (-0.6%)2.012s (~)0.624s151.02x
💻 LocalExpress1.409s (+1.5%)2.006s (~)0.597s151.03x
💻 LocalNitro1.416s (~)2.005s (~)0.589s151.04x
🐘 PostgresNext.js (Turbopack)1.782s (+1.0%)2.016s (~)0.234s151.31x
🌐 MongoDBNext.js (Turbopack)2.127s (-1.3%)3.012s (~)0.886s101.56x
🌐 TursoNext.js (Turbopack)2.235s (+1.1%)3.016s (~)0.781s101.64x
🐘 PostgresExpress2.270s (+1.1%)3.013s (+6.5% 🔺)0.743s101.67x
🐘 PostgresNitro2.494s (+5.9% 🔺)3.012s (~)0.519s101.83x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express2.899s (-11.3% 🟢)3.762s (-8.6% 🟢)0.863s81.00x
▲ VercelNext.js (Turbopack)3.126s (-2.8%)3.818s (-5.4% 🟢)0.692s81.08x
▲ VercelNitro3.531s (+10.3% 🔺)4.461s (+16.6% 🔺)0.930s71.22x

🔍 Observability: Express | Next.js (Turbopack) | Nitro

Promise.all with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Express2.154s (~)3.125s (~)0.971s101.00x
💻 LocalNext.js (Turbopack)2.207s (+6.6% 🔺)3.153s (+11.2% 🔺)0.946s101.02x
💻 LocalNitro2.257s (+3.3%)3.195s (+2.3%)0.938s101.05x
🌐 StarterNext.js (Turbopack)2.481s (+1.8%)3.010s (~)0.529s101.15x
🌐 RedisNext.js (Turbopack)2.481s (~)3.013s (~)0.532s101.15x
🐘 PostgresNext.js (Turbopack)2.487s (-1.7%)3.017s (~)0.530s101.15x
🐘 PostgresNitro2.903s (-2.7%)3.012s (-10.2% 🟢)0.108s101.35x
🐘 PostgresExpress3.029s (+23.6% 🔺)3.583s (+19.0% 🔺)0.554s91.41x
🌐 MongoDBNext.js (Turbopack)4.617s (~)5.181s (~)0.564s62.14x
🌐 TursoNext.js (Turbopack)4.768s (+2.2%)5.184s (~)0.416s62.21x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro3.497s (-2.5%)3.933s (-19.4% 🟢)0.435s81.00x
▲ VercelExpress3.764s (-7.1% 🟢)4.574s (-2.9%)0.811s71.08x
▲ VercelNext.js (Turbopack)3.954s (+12.1% 🔺)4.614s (+4.4%)0.660s71.13x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

Promise.race with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🌐 Starter🥇 Next.js (Turbopack)1.380s (+2.1%)2.008s (~)0.628s151.00x
🌐 RedisNext.js (Turbopack)1.381s (+1.4%)2.010s (~)0.629s151.00x
💻 LocalNext.js (Turbopack)1.405s (+0.8%)2.013s (~)0.608s151.02x
💻 LocalExpress1.409s (+0.9%)2.006s (~)0.597s151.02x
💻 LocalNitro1.426s (+0.9%)2.005s (~)0.579s151.03x
🐘 PostgresNitro1.669s (-12.6% 🟢)2.010s (~)0.341s151.21x
🐘 PostgresNext.js (Turbopack)1.681s (~)2.012s (~)0.331s151.22x
🐘 PostgresExpress1.852s (+4.1%)2.009s (~)0.158s151.34x
🌐 MongoDBNext.js (Turbopack)2.178s (+1.4%)3.011s (~)0.833s101.58x
🌐 TursoNext.js (Turbopack)2.208s (~)3.014s (~)0.806s101.60x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro2.936s (+5.1% 🔺)3.642s (+1.0%)0.706s91.00x
▲ VercelExpress3.054s (+3.3%)3.979s (+3.1%)0.925s81.04x
▲ VercelNext.js (Turbopack)3.084s (+9.5% 🔺)3.870s (+3.8%)0.785s81.05x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

Promise.race with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Express2.208s (+1.2%)3.162s (~)0.954s101.00x
💻 LocalNext.js (Turbopack)2.244s (+3.7%)3.188s (+6.9% 🔺)0.944s101.02x
💻 LocalNitro2.250s (+1.8%)3.196s (+1.3%)0.946s101.02x
🌐 RedisNext.js (Turbopack)2.478s (+0.5%)3.014s (~)0.536s101.12x
🌐 StarterNext.js (Turbopack)2.518s (+1.9%)3.053s (+1.5%)0.535s101.14x
🐘 PostgresNext.js (Turbopack)2.554s (+2.6%)3.024s (~)0.471s101.16x
🐘 PostgresExpress2.556s (-1.4%)3.015s (~)0.460s101.16x
🐘 PostgresNitro2.881s (+8.8% 🔺)3.123s (+3.7%)0.242s101.30x
🌐 MongoDBNext.js (Turbopack)4.669s (-0.9%)5.180s (~)0.511s62.11x
🌐 TursoNext.js (Turbopack)4.803s (+3.7%)5.182s (~)0.379s62.17x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express3.200s (-15.6% 🟢)3.896s (-11.3% 🟢)0.696s81.00x
▲ VercelNext.js (Turbopack)3.438s (-6.0% 🟢)4.099s (-5.3% 🟢)0.661s81.07x
▲ VercelNitro3.752s (+10.3% 🔺)4.560s (+9.1% 🔺)0.808s71.17x

🔍 Observability: Express | Next.js (Turbopack) | Nitro

Stream Benchmarks(includes TTFB metrics)
workflow with stream

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🌐 Starter🥇 Next.js (Turbopack)0.141s (+12.4% 🔺)1.006s (~)0.000s (~)1.013s (~)0.871s101.00x
🌐 RedisNext.js (Turbopack)0.151s (+4.9%)1.005s (~)0.000s (+Infinity% 🔺)1.014s (~)0.864s101.07x
💻 LocalNext.js (Turbopack)0.151s (+8.3% 🔺)1.003s (~)0.017s (-2.8%)1.028s (~)0.877s101.07x
💻 LocalExpress0.175s (+0.6%)0.992s (~)0.018s (+11.4% 🔺)1.024s (~)0.849s101.24x
💻 LocalNitro0.182s (+2.9%)0.992s (~)0.016s (-2.4%)1.022s (~)0.840s101.29x
🌐 MongoDBNext.js (Turbopack)0.482s (-7.5% 🟢)0.964s (+3.8%)0.000s (+Infinity% 🔺)1.013s (~)0.530s103.41x
🌐 TursoNext.js (Turbopack)0.525s (+2.7%)0.930s (-0.7%)0.000s (NaN%)1.014s (~)0.489s103.72x
🐘 PostgresNext.js (Turbopack)0.696s (-41.2% 🟢)0.857s (-44.2% 🟢)0.000s (NaN%)1.016s (-41.2% 🟢)0.319s104.93x
🐘 PostgresExpress2.233s (-6.9% 🟢)2.809s (+6.2% 🔺)0.000s (NaN%)3.015s (~)0.781s1015.80x
🐘 PostgresNitro2.422s (+9.0% 🔺)2.621s (-7.2% 🟢)0.000s (-100.0% 🟢)3.013s (~)0.591s1017.14x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)2.743s (-12.9% 🟢)3.301s (-8.3% 🟢)0.547s (+10.5% 🔺)4.287s (-6.9% 🟢)1.543s101.00x
▲ VercelNitro2.838s (-2.5%)3.153s (-4.8%)0.390s (-10.5% 🟢)4.017s (-4.7%)1.179s101.03x
▲ VercelExpress2.964s (~)3.372s (+4.5%)0.471s (+16.9% 🔺)4.415s (+5.5% 🔺)1.452s101.08x

🔍 Observability: Next.js (Turbopack) | Nitro | Express

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World🥇 Fastest FrameworkWins
💻 LocalNext.js (Turbopack)6/8
🐘 PostgresNext.js (Turbopack)6/8
▲ VercelNitro4/8
Fastest World by Framework

Winner determined by most benchmark wins

Framework🥇 Fastest WorldWins
Express💻 Local8/8
Next.js (Turbopack)🌐 Starter4/8
Nitro💻 Local8/8
Column Definitions
  • Workflow Time: Runtime reported by workflow (completedAt - createdAt) - primary metric
  • TTFB: Time to First Byte - time from workflow start until first stream byte received (stream benchmarks only)
  • Slurp: Time from first byte to complete stream consumption (stream benchmarks only)
  • Wall Time: Total testbench time (trigger workflow + poll for result)
  • Overhead: Testbench overhead (Wall Time - Workflow Time)
  • Samples: Number of benchmark iterations run
  • vs Fastest: How much slower compared to the fastest configuration for this benchmark

Worlds:

  • 💻 Local: In-memory filesystem world (local development)
  • 🐘 Postgres: PostgreSQL database world (local development)
  • ▲ Vercel: Vercel production/preview deployment
  • 🌐 Starter: Community world (local development)
  • 🌐 Turso: Community world (local development)
  • 🌐 MongoDB: Community world (local development)
  • 🌐 Redis: Community world (local development)
  • 🌐 Jazz: Community world (local development)

📋 View full workflow run

Comment threadpackages/cli/src/lib/inspect/setup.ts Outdated
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
vercel[bot]

This comment was marked as resolved.

Comment threadpackages/cli/src/lib/update-check.ts
vercelBotand others added 5 commits December 30, 2025 10:10
…me using `createRequire` with a relative path. When bundled by Vite/SvelteKit for SSR, the relative path becomes invalid because the output file is at a different location than the source file, causing a MODULE_NOT_FOUND error. The fix uses `import.meta.resolve()` which provides correct path resolution even in bundled environments.
This commit fixes the issue reported at packages/world-local/src/init.ts:1-18
## SvelteKit build fails: Cannot find module '../package.json' in bundled SSR code
**What fails:** During SvelteKit SSR build, the `vite build` command fails with error: `Error: Cannot find module '../package.json'` in compiled code at `.svelte-kit/output/server/chunks/step-handler.js:1711:21`
**How to reproduce:**
```bash
cd workbench/sveltekit
pnpm run build
```
During the "rendering chunks" phase, when Vite bundles the SSR output, the compiled code attempts to require `../package.json` which fails because the relative path from the bundled output file location is invalid.
**Result:**
```
Error: Cannot find module '../package.json'
Require stack:
- /vercel/path0/workbench/sveltekit/.svelte-kit/output/server/chunks/step-handler.js
```
**Root cause:** The `packages/world-local/src/init.ts` file uses `createRequire(import.meta.url)` with a relative path `../package.json` to load the package.json file. When Rollup/Vite bundles this code for SSR, the relative path becomes invalid because the output file is at a different location than the source file.
**Solution:** Use `import.meta.resolve()` which provides proper module path resolution even in bundled environments. Falls back to `createRequire()` for compatibility with test environments where `import.meta.resolve()` may not be available.
Co-authored-by: Vercel <vercel[bot]@users.noreply.github.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Comment threadpackages/cli/src/lib/update-check.ts Outdated
VaguelySeriousand others added 4 commits January 2, 2026 14:40
Co-authored-by: vercel[bot] <35613825+vercel[bot]@users.noreply.github.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@VaguelySerious@pranaygp
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

[cli] Print notice on CLI startup when detecting an outdated version - #701

Merged
VaguelySerious merged 17 commits into
mainfrom
peter/cli-check-for-updates-manual
Jan 2, 2026
Merged

[cli] Print notice on CLI startup when detecting an outdated version#701
VaguelySerious merged 17 commits into
mainfrom
peter/cli-check-for-updates-manual

Conversation

@VaguelySerious

@VaguelySeriousVaguelySerious commented Dec 29, 2025

Copy link
Copy Markdown
Member

This superseeds #657, which tried to use an npm plugin for this job, but was ugly and didn't work with pre-release versions, so I had claude implement it instead.

Essentially:

  • First time you run the CLI it'll do a sync check to npm (failures being ignored) for new version, caching this for 3 days
  • Update note will be displayed in message header on every invocation in interactive mode, where we would usually just display the version
    • This might not be good enough for notifying users consistently. If this code seems good, I can extract it into utils, and also import it in the builder code to print during build in a shorter format.
  • Changing the package version busts the cache, so upgrading will reset the cache
  • i.e. also users who upgrade to latest won't see the "new version is available" note until at the earliest 3 day after that
  • The message may be off if someone installs @workflow/cli globally separately from workflow, since p i workflow@latest wouldn't resolve the update warning, but this seems like a minor concern.
image

Signed-off-by: Peter Wielander <mittgfu@gmail.com>
@vercel

vercelBot commented Dec 29, 2025

Copy link
Copy Markdown
Contributor

@changeset-bot

changeset-botBot commented Dec 29, 2025

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 3d0d66e

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

This PR includes changesets to release 4 packages
NameType
@workflow/cliPatch
workflowPatch
@workflow/world-testingPatch
@workflow/aiPatch

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

@github-actions

github-actionsBot commented Dec 29, 2025

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

Some tests failed

Summary

PassedFailedSkippedTotal
✅ ▲ Vercel Production308011319
✅ 💻 Local Development28208290
✅ 📦 Local Production28208290
✅ 🐘 Local Postgres28208290
✅ 🪟 Windows290029
❌ 🌍 Community Worlds117110128
Total130011351346

❌ Failed Tests

🌍 Community Worlds (11 failed)

mongodb (1 failed):

  • webhookWorkflow

starter (9 failed):

  • addTenWorkflow
  • addTenWorkflow
  • retryAttemptCounterWorkflow
  • crossFileErrorWorkflow - stack traces work across imported modules
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly

turso (1 failed):

  • webhookWorkflow

Details by Category

✅ ▲ Vercel Production
AppPassedFailedSkipped
✅ astro2801
✅ example2801
✅ express2801
✅ fastify2801
✅ hono2801
✅ nextjs-turbopack2801
✅ nextjs-webpack2801
✅ nitro2801
✅ nuxt2801
✅ sveltekit2801
✅ vite2801
✅ 💻 Local Development
AppPassedFailedSkipped
✅ astro-stable2801
✅ express-stable2801
✅ fastify-stable2801
✅ hono-stable2801
✅ nextjs-turbopack-stable2900
✅ nextjs-webpack-stable2900
✅ nitro-stable2801
✅ nuxt-stable2801
✅ sveltekit-stable2801
✅ vite-stable2801
✅ 📦 Local Production
AppPassedFailedSkipped
✅ astro-stable2801
✅ express-stable2801
✅ fastify-stable2801
✅ hono-stable2801
✅ nextjs-turbopack-stable2900
✅ nextjs-webpack-stable2900
✅ nitro-stable2801
✅ nuxt-stable2801
✅ sveltekit-stable2801
✅ vite-stable2801
✅ 🐘 Local Postgres
AppPassedFailedSkipped
✅ astro-stable2801
✅ express-stable2801
✅ fastify-stable2801
✅ hono-stable2801
✅ nextjs-turbopack-stable2900
✅ nextjs-webpack-stable2900
✅ nitro-stable2801
✅ nuxt-stable2801
✅ sveltekit-stable2801
✅ vite-stable2801
✅ 🪟 Windows
AppPassedFailedSkipped
✅ nextjs-turbopack2900
❌ 🌍 Community Worlds
AppPassedFailedSkipped
✅ mongodb-dev300
❌ mongodb2810
✅ redis-dev300
✅ redis2900
✅ starter-dev300
❌ starter2090
✅ turso-dev300
❌ turso2810

📋 View full workflow run

@github-actions

github-actionsBot commented Dec 29, 2025

Copy link
Copy Markdown
Contributor

📊 Benchmark Results

📈 Comparing against baseline from main branch. Green 🟢 = faster, Red 🔺 = slower.

workflow with no steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)0.039s (+5.1% 🔺)1.014s (~)0.975s101.00x
🌐 StarterNext.js (Turbopack)0.040s (+8.6% 🔺)1.015s (~)0.974s101.03x
🌐 RedisNext.js (Turbopack)0.041s (+1.2%)1.017s (~)0.975s101.05x
💻 LocalExpress0.043s (-1.4%)1.007s (~)0.964s101.09x
💻 LocalNitro0.044s (~)1.006s (~)0.962s101.14x
🌐 TursoNext.js (Turbopack)0.102s (~)1.015s (~)0.913s102.60x
🌐 MongoDBNext.js (Turbopack)0.108s (+7.5% 🔺)1.014s (~)0.906s102.77x
🐘 PostgresExpress0.208s (-44.5% 🟢)1.014s (~)0.806s105.30x
🐘 PostgresNext.js (Turbopack)0.215s (-10.8% 🟢)1.019s (~)0.804s105.48x
🐘 PostgresNitro0.406s (+29.8% 🔺)1.012s (~)0.606s1010.35x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)0.535s (-11.0% 🟢)2.450s (+53.0% 🔺)1.914s101.00x
▲ VercelExpress0.635s (-16.3% 🟢)1.869s (+1.6%)1.234s101.19x
▲ VercelNitro0.725s (-35.1% 🟢)1.719s (-14.0% 🟢)0.994s101.35x

🔍 Observability: Next.js (Turbopack) | Express | Nitro

workflow with 1 step

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🌐 Starter🥇 Next.js (Turbopack)1.090s (~)2.010s (~)0.920s101.00x
💻 LocalNext.js (Turbopack)1.091s (-0.5%)2.011s (~)0.920s101.00x
🌐 RedisNext.js (Turbopack)1.107s (~)2.012s (~)0.905s101.02x
💻 LocalExpress1.110s (~)2.007s (~)0.896s101.02x
💻 LocalNitro1.114s (~)2.006s (~)0.892s101.02x
🌐 MongoDBNext.js (Turbopack)1.310s (~)2.012s (~)0.702s101.20x
🌐 TursoNext.js (Turbopack)1.310s (+0.7%)2.013s (~)0.703s101.20x
🐘 PostgresNext.js (Turbopack)1.639s (-10.8% 🟢)2.015s (~)0.376s101.50x
🐘 PostgresExpress2.260s (+1.3%)3.014s (~)0.754s102.07x
🐘 PostgresNitro2.285s (+7.7% 🔺)3.012s (~)0.727s102.10x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro2.680s (-3.0%)3.575s (-2.3%)0.896s101.00x
▲ VercelExpress3.185s (~)4.180s (+0.9%)0.995s101.19x
▲ VercelNext.js (Turbopack)3.223s (+17.8% 🔺)4.131s (+12.9% 🔺)0.908s101.20x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

workflow with 10 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🌐 Starter🥇 Next.js (Turbopack)10.627s (~)11.013s (~)0.385s51.00x
💻 LocalNext.js (Turbopack)10.667s (~)11.019s (~)0.352s51.00x
🌐 RedisNext.js (Turbopack)10.687s (~)11.019s (~)0.332s51.01x
💻 LocalExpress10.771s (~)11.012s (~)0.241s51.01x
💻 LocalNitro10.801s (~)11.012s (~)0.212s51.02x
🌐 MongoDBNext.js (Turbopack)12.178s (~)13.021s (~)0.842s51.15x
🌐 TursoNext.js (Turbopack)12.196s (~)13.038s (~)0.842s51.15x
🐘 PostgresNext.js (Turbopack)14.119s (-5.6% 🟢)14.429s (-7.7% 🟢)0.310s51.33x
🐘 PostgresNitro20.219s (-1.0%)21.040s (~)0.820s51.90x
🐘 PostgresExpress20.436s (+0.8%)21.032s (~)0.596s51.92x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro22.176s (-4.8%)23.160s (-2.6%)0.984s51.00x
▲ VercelExpress22.764s (-1.2%)23.376s (-0.9%)0.612s51.03x
▲ VercelNext.js (Turbopack)22.987s (~)23.791s (~)0.804s51.04x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

Promise.all with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🌐 Redis🥇 Next.js (Turbopack)1.363s (+0.9%)2.010s (~)0.647s151.00x
🌐 StarterNext.js (Turbopack)1.364s (+1.8%)2.008s (~)0.644s151.00x
💻 LocalNext.js (Turbopack)1.388s (-0.6%)2.012s (~)0.624s151.02x
💻 LocalExpress1.409s (+1.5%)2.006s (~)0.597s151.03x
💻 LocalNitro1.416s (~)2.005s (~)0.589s151.04x
🐘 PostgresNext.js (Turbopack)1.782s (+1.0%)2.016s (~)0.234s151.31x
🌐 MongoDBNext.js (Turbopack)2.127s (-1.3%)3.012s (~)0.886s101.56x
🌐 TursoNext.js (Turbopack)2.235s (+1.1%)3.016s (~)0.781s101.64x
🐘 PostgresExpress2.270s (+1.1%)3.013s (+6.5% 🔺)0.743s101.67x
🐘 PostgresNitro2.494s (+5.9% 🔺)3.012s (~)0.519s101.83x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express2.899s (-11.3% 🟢)3.762s (-8.6% 🟢)0.863s81.00x
▲ VercelNext.js (Turbopack)3.126s (-2.8%)3.818s (-5.4% 🟢)0.692s81.08x
▲ VercelNitro3.531s (+10.3% 🔺)4.461s (+16.6% 🔺)0.930s71.22x

🔍 Observability: Express | Next.js (Turbopack) | Nitro

Promise.all with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Express2.154s (~)3.125s (~)0.971s101.00x
💻 LocalNext.js (Turbopack)2.207s (+6.6% 🔺)3.153s (+11.2% 🔺)0.946s101.02x
💻 LocalNitro2.257s (+3.3%)3.195s (+2.3%)0.938s101.05x
🌐 StarterNext.js (Turbopack)2.481s (+1.8%)3.010s (~)0.529s101.15x
🌐 RedisNext.js (Turbopack)2.481s (~)3.013s (~)0.532s101.15x
🐘 PostgresNext.js (Turbopack)2.487s (-1.7%)3.017s (~)0.530s101.15x
🐘 PostgresNitro2.903s (-2.7%)3.012s (-10.2% 🟢)0.108s101.35x
🐘 PostgresExpress3.029s (+23.6% 🔺)3.583s (+19.0% 🔺)0.554s91.41x
🌐 MongoDBNext.js (Turbopack)4.617s (~)5.181s (~)0.564s62.14x
🌐 TursoNext.js (Turbopack)4.768s (+2.2%)5.184s (~)0.416s62.21x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro3.497s (-2.5%)3.933s (-19.4% 🟢)0.435s81.00x
▲ VercelExpress3.764s (-7.1% 🟢)4.574s (-2.9%)0.811s71.08x
▲ VercelNext.js (Turbopack)3.954s (+12.1% 🔺)4.614s (+4.4%)0.660s71.13x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

Promise.race with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🌐 Starter🥇 Next.js (Turbopack)1.380s (+2.1%)2.008s (~)0.628s151.00x
🌐 RedisNext.js (Turbopack)1.381s (+1.4%)2.010s (~)0.629s151.00x
💻 LocalNext.js (Turbopack)1.405s (+0.8%)2.013s (~)0.608s151.02x
💻 LocalExpress1.409s (+0.9%)2.006s (~)0.597s151.02x
💻 LocalNitro1.426s (+0.9%)2.005s (~)0.579s151.03x
🐘 PostgresNitro1.669s (-12.6% 🟢)2.010s (~)0.341s151.21x
🐘 PostgresNext.js (Turbopack)1.681s (~)2.012s (~)0.331s151.22x
🐘 PostgresExpress1.852s (+4.1%)2.009s (~)0.158s151.34x
🌐 MongoDBNext.js (Turbopack)2.178s (+1.4%)3.011s (~)0.833s101.58x
🌐 TursoNext.js (Turbopack)2.208s (~)3.014s (~)0.806s101.60x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro2.936s (+5.1% 🔺)3.642s (+1.0%)0.706s91.00x
▲ VercelExpress3.054s (+3.3%)3.979s (+3.1%)0.925s81.04x
▲ VercelNext.js (Turbopack)3.084s (+9.5% 🔺)3.870s (+3.8%)0.785s81.05x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

Promise.race with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Express2.208s (+1.2%)3.162s (~)0.954s101.00x
💻 LocalNext.js (Turbopack)2.244s (+3.7%)3.188s (+6.9% 🔺)0.944s101.02x
💻 LocalNitro2.250s (+1.8%)3.196s (+1.3%)0.946s101.02x
🌐 RedisNext.js (Turbopack)2.478s (+0.5%)3.014s (~)0.536s101.12x
🌐 StarterNext.js (Turbopack)2.518s (+1.9%)3.053s (+1.5%)0.535s101.14x
🐘 PostgresNext.js (Turbopack)2.554s (+2.6%)3.024s (~)0.471s101.16x
🐘 PostgresExpress2.556s (-1.4%)3.015s (~)0.460s101.16x
🐘 PostgresNitro2.881s (+8.8% 🔺)3.123s (+3.7%)0.242s101.30x
🌐 MongoDBNext.js (Turbopack)4.669s (-0.9%)5.180s (~)0.511s62.11x
🌐 TursoNext.js (Turbopack)4.803s (+3.7%)5.182s (~)0.379s62.17x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express3.200s (-15.6% 🟢)3.896s (-11.3% 🟢)0.696s81.00x
▲ VercelNext.js (Turbopack)3.438s (-6.0% 🟢)4.099s (-5.3% 🟢)0.661s81.07x
▲ VercelNitro3.752s (+10.3% 🔺)4.560s (+9.1% 🔺)0.808s71.17x

🔍 Observability: Express | Next.js (Turbopack) | Nitro

Stream Benchmarks(includes TTFB metrics)
workflow with stream

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🌐 Starter🥇 Next.js (Turbopack)0.141s (+12.4% 🔺)1.006s (~)0.000s (~)1.013s (~)0.871s101.00x
🌐 RedisNext.js (Turbopack)0.151s (+4.9%)1.005s (~)0.000s (+Infinity% 🔺)1.014s (~)0.864s101.07x
💻 LocalNext.js (Turbopack)0.151s (+8.3% 🔺)1.003s (~)0.017s (-2.8%)1.028s (~)0.877s101.07x
💻 LocalExpress0.175s (+0.6%)0.992s (~)0.018s (+11.4% 🔺)1.024s (~)0.849s101.24x
💻 LocalNitro0.182s (+2.9%)0.992s (~)0.016s (-2.4%)1.022s (~)0.840s101.29x
🌐 MongoDBNext.js (Turbopack)0.482s (-7.5% 🟢)0.964s (+3.8%)0.000s (+Infinity% 🔺)1.013s (~)0.530s103.41x
🌐 TursoNext.js (Turbopack)0.525s (+2.7%)0.930s (-0.7%)0.000s (NaN%)1.014s (~)0.489s103.72x
🐘 PostgresNext.js (Turbopack)0.696s (-41.2% 🟢)0.857s (-44.2% 🟢)0.000s (NaN%)1.016s (-41.2% 🟢)0.319s104.93x
🐘 PostgresExpress2.233s (-6.9% 🟢)2.809s (+6.2% 🔺)0.000s (NaN%)3.015s (~)0.781s1015.80x
🐘 PostgresNitro2.422s (+9.0% 🔺)2.621s (-7.2% 🟢)0.000s (-100.0% 🟢)3.013s (~)0.591s1017.14x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)2.743s (-12.9% 🟢)3.301s (-8.3% 🟢)0.547s (+10.5% 🔺)4.287s (-6.9% 🟢)1.543s101.00x
▲ VercelNitro2.838s (-2.5%)3.153s (-4.8%)0.390s (-10.5% 🟢)4.017s (-4.7%)1.179s101.03x
▲ VercelExpress2.964s (~)3.372s (+4.5%)0.471s (+16.9% 🔺)4.415s (+5.5% 🔺)1.452s101.08x

🔍 Observability: Next.js (Turbopack) | Nitro | Express

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World🥇 Fastest FrameworkWins
💻 LocalNext.js (Turbopack)6/8
🐘 PostgresNext.js (Turbopack)6/8
▲ VercelNitro4/8
Fastest World by Framework

Winner determined by most benchmark wins

Framework🥇 Fastest WorldWins
Express💻 Local8/8
Next.js (Turbopack)🌐 Starter4/8
Nitro💻 Local8/8
Column Definitions
  • Workflow Time: Runtime reported by workflow (completedAt - createdAt) - primary metric
  • TTFB: Time to First Byte - time from workflow start until first stream byte received (stream benchmarks only)
  • Slurp: Time from first byte to complete stream consumption (stream benchmarks only)
  • Wall Time: Total testbench time (trigger workflow + poll for result)
  • Overhead: Testbench overhead (Wall Time - Workflow Time)
  • Samples: Number of benchmark iterations run
  • vs Fastest: How much slower compared to the fastest configuration for this benchmark

Worlds:

  • 💻 Local: In-memory filesystem world (local development)
  • 🐘 Postgres: PostgreSQL database world (local development)
  • ▲ Vercel: Vercel production/preview deployment
  • 🌐 Starter: Community world (local development)
  • 🌐 Turso: Community world (local development)
  • 🌐 MongoDB: Community world (local development)
  • 🌐 Redis: Community world (local development)
  • 🌐 Jazz: Community world (local development)

📋 View full workflow run

Comment threadpackages/cli/src/lib/inspect/setup.ts Outdated
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
vercel[bot]

This comment was marked as resolved.

Comment threadpackages/cli/src/lib/update-check.ts
vercelBotand others added 5 commits December 30, 2025 10:10
…me using `createRequire` with a relative path. When bundled by Vite/SvelteKit for SSR, the relative path becomes invalid because the output file is at a different location than the source file, causing a MODULE_NOT_FOUND error. The fix uses `import.meta.resolve()` which provides correct path resolution even in bundled environments.
This commit fixes the issue reported at packages/world-local/src/init.ts:1-18
## SvelteKit build fails: Cannot find module '../package.json' in bundled SSR code
**What fails:** During SvelteKit SSR build, the `vite build` command fails with error: `Error: Cannot find module '../package.json'` in compiled code at `.svelte-kit/output/server/chunks/step-handler.js:1711:21`
**How to reproduce:**
```bash
cd workbench/sveltekit
pnpm run build
```
During the "rendering chunks" phase, when Vite bundles the SSR output, the compiled code attempts to require `../package.json` which fails because the relative path from the bundled output file location is invalid.
**Result:**
```
Error: Cannot find module '../package.json'
Require stack:
- /vercel/path0/workbench/sveltekit/.svelte-kit/output/server/chunks/step-handler.js
```
**Root cause:** The `packages/world-local/src/init.ts` file uses `createRequire(import.meta.url)` with a relative path `../package.json` to load the package.json file. When Rollup/Vite bundles this code for SSR, the relative path becomes invalid because the output file is at a different location than the source file.
**Solution:** Use `import.meta.resolve()` which provides proper module path resolution even in bundled environments. Falls back to `createRequire()` for compatibility with test environments where `import.meta.resolve()` may not be available.
Co-authored-by: Vercel <vercel[bot]@users.noreply.github.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Comment threadpackages/cli/src/lib/update-check.ts Outdated
VaguelySeriousand others added 4 commits January 2, 2026 14:40
Co-authored-by: vercel[bot] <35613825+vercel[bot]@users.noreply.github.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@VaguelySerious@pranaygp
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[cli] Print notice on CLI startup when detecting an outdated version - #701

Merged
VaguelySerious merged 17 commits into
mainfrom
peter/cli-check-for-updates-manual
Jan 2, 2026
Merged

[cli] Print notice on CLI startup when detecting an outdated version#701
VaguelySerious merged 17 commits into
mainfrom
peter/cli-check-for-updates-manual

Conversation

@VaguelySerious

@VaguelySeriousVaguelySerious commented Dec 29, 2025

Copy link
Copy Markdown
Member

This superseeds #657, which tried to use an npm plugin for this job, but was ugly and didn't work with pre-release versions, so I had claude implement it instead.

Essentially:

  • First time you run the CLI it'll do a sync check to npm (failures being ignored) for new version, caching this for 3 days
  • Update note will be displayed in message header on every invocation in interactive mode, where we would usually just display the version
    • This might not be good enough for notifying users consistently. If this code seems good, I can extract it into utils, and also import it in the builder code to print during build in a shorter format.
  • Changing the package version busts the cache, so upgrading will reset the cache
  • i.e. also users who upgrade to latest won't see the "new version is available" note until at the earliest 3 day after that
  • The message may be off if someone installs @workflow/cli globally separately from workflow, since p i workflow@latest wouldn't resolve the update warning, but this seems like a minor concern.
image

Signed-off-by: Peter Wielander <mittgfu@gmail.com>
@vercel

vercelBot commented Dec 29, 2025

Copy link
Copy Markdown
Contributor

@changeset-bot

changeset-botBot commented Dec 29, 2025

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 3d0d66e

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

This PR includes changesets to release 4 packages
NameType
@workflow/cliPatch
workflowPatch
@workflow/world-testingPatch
@workflow/aiPatch

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

@github-actions

github-actionsBot commented Dec 29, 2025

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

Some tests failed

Summary

PassedFailedSkippedTotal
✅ ▲ Vercel Production308011319
✅ 💻 Local Development28208290
✅ 📦 Local Production28208290
✅ 🐘 Local Postgres28208290
✅ 🪟 Windows290029
❌ 🌍 Community Worlds117110128
Total130011351346

❌ Failed Tests

🌍 Community Worlds (11 failed)

mongodb (1 failed):

  • webhookWorkflow

starter (9 failed):

  • addTenWorkflow
  • addTenWorkflow
  • retryAttemptCounterWorkflow
  • crossFileErrorWorkflow - stack traces work across imported modules
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly

turso (1 failed):

  • webhookWorkflow

Details by Category

✅ ▲ Vercel Production
AppPassedFailedSkipped
✅ astro2801
✅ example2801
✅ express2801
✅ fastify2801
✅ hono2801
✅ nextjs-turbopack2801
✅ nextjs-webpack2801
✅ nitro2801
✅ nuxt2801
✅ sveltekit2801
✅ vite2801
✅ 💻 Local Development
AppPassedFailedSkipped
✅ astro-stable2801
✅ express-stable2801
✅ fastify-stable2801
✅ hono-stable2801
✅ nextjs-turbopack-stable2900
✅ nextjs-webpack-stable2900
✅ nitro-stable2801
✅ nuxt-stable2801
✅ sveltekit-stable2801
✅ vite-stable2801
✅ 📦 Local Production
AppPassedFailedSkipped
✅ astro-stable2801
✅ express-stable2801
✅ fastify-stable2801
✅ hono-stable2801
✅ nextjs-turbopack-stable2900
✅ nextjs-webpack-stable2900
✅ nitro-stable2801
✅ nuxt-stable2801
✅ sveltekit-stable2801
✅ vite-stable2801
✅ 🐘 Local Postgres
AppPassedFailedSkipped
✅ astro-stable2801
✅ express-stable2801
✅ fastify-stable2801
✅ hono-stable2801
✅ nextjs-turbopack-stable2900
✅ nextjs-webpack-stable2900
✅ nitro-stable2801
✅ nuxt-stable2801
✅ sveltekit-stable2801
✅ vite-stable2801
✅ 🪟 Windows
AppPassedFailedSkipped
✅ nextjs-turbopack2900
❌ 🌍 Community Worlds
AppPassedFailedSkipped
✅ mongodb-dev300
❌ mongodb2810
✅ redis-dev300
✅ redis2900
✅ starter-dev300
❌ starter2090
✅ turso-dev300
❌ turso2810

📋 View full workflow run

@github-actions

github-actionsBot commented Dec 29, 2025

Copy link
Copy Markdown
Contributor

📊 Benchmark Results

📈 Comparing against baseline from main branch. Green 🟢 = faster, Red 🔺 = slower.

workflow with no steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)0.039s (+5.1% 🔺)1.014s (~)0.975s101.00x
🌐 StarterNext.js (Turbopack)0.040s (+8.6% 🔺)1.015s (~)0.974s101.03x
🌐 RedisNext.js (Turbopack)0.041s (+1.2%)1.017s (~)0.975s101.05x
💻 LocalExpress0.043s (-1.4%)1.007s (~)0.964s101.09x
💻 LocalNitro0.044s (~)1.006s (~)0.962s101.14x
🌐 TursoNext.js (Turbopack)0.102s (~)1.015s (~)0.913s102.60x
🌐 MongoDBNext.js (Turbopack)0.108s (+7.5% 🔺)1.014s (~)0.906s102.77x
🐘 PostgresExpress0.208s (-44.5% 🟢)1.014s (~)0.806s105.30x
🐘 PostgresNext.js (Turbopack)0.215s (-10.8% 🟢)1.019s (~)0.804s105.48x
🐘 PostgresNitro0.406s (+29.8% 🔺)1.012s (~)0.606s1010.35x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)0.535s (-11.0% 🟢)2.450s (+53.0% 🔺)1.914s101.00x
▲ VercelExpress0.635s (-16.3% 🟢)1.869s (+1.6%)1.234s101.19x
▲ VercelNitro0.725s (-35.1% 🟢)1.719s (-14.0% 🟢)0.994s101.35x

🔍 Observability: Next.js (Turbopack) | Express | Nitro

workflow with 1 step

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🌐 Starter🥇 Next.js (Turbopack)1.090s (~)2.010s (~)0.920s101.00x
💻 LocalNext.js (Turbopack)1.091s (-0.5%)2.011s (~)0.920s101.00x
🌐 RedisNext.js (Turbopack)1.107s (~)2.012s (~)0.905s101.02x
💻 LocalExpress1.110s (~)2.007s (~)0.896s101.02x
💻 LocalNitro1.114s (~)2.006s (~)0.892s101.02x
🌐 MongoDBNext.js (Turbopack)1.310s (~)2.012s (~)0.702s101.20x
🌐 TursoNext.js (Turbopack)1.310s (+0.7%)2.013s (~)0.703s101.20x
🐘 PostgresNext.js (Turbopack)1.639s (-10.8% 🟢)2.015s (~)0.376s101.50x
🐘 PostgresExpress2.260s (+1.3%)3.014s (~)0.754s102.07x
🐘 PostgresNitro2.285s (+7.7% 🔺)3.012s (~)0.727s102.10x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro2.680s (-3.0%)3.575s (-2.3%)0.896s101.00x
▲ VercelExpress3.185s (~)4.180s (+0.9%)0.995s101.19x
▲ VercelNext.js (Turbopack)3.223s (+17.8% 🔺)4.131s (+12.9% 🔺)0.908s101.20x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

workflow with 10 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🌐 Starter🥇 Next.js (Turbopack)10.627s (~)11.013s (~)0.385s51.00x
💻 LocalNext.js (Turbopack)10.667s (~)11.019s (~)0.352s51.00x
🌐 RedisNext.js (Turbopack)10.687s (~)11.019s (~)0.332s51.01x
💻 LocalExpress10.771s (~)11.012s (~)0.241s51.01x
💻 LocalNitro10.801s (~)11.012s (~)0.212s51.02x
🌐 MongoDBNext.js (Turbopack)12.178s (~)13.021s (~)0.842s51.15x
🌐 TursoNext.js (Turbopack)12.196s (~)13.038s (~)0.842s51.15x
🐘 PostgresNext.js (Turbopack)14.119s (-5.6% 🟢)14.429s (-7.7% 🟢)0.310s51.33x
🐘 PostgresNitro20.219s (-1.0%)21.040s (~)0.820s51.90x
🐘 PostgresExpress20.436s (+0.8%)21.032s (~)0.596s51.92x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro22.176s (-4.8%)23.160s (-2.6%)0.984s51.00x
▲ VercelExpress22.764s (-1.2%)23.376s (-0.9%)0.612s51.03x
▲ VercelNext.js (Turbopack)22.987s (~)23.791s (~)0.804s51.04x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

Promise.all with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🌐 Redis🥇 Next.js (Turbopack)1.363s (+0.9%)2.010s (~)0.647s151.00x
🌐 StarterNext.js (Turbopack)1.364s (+1.8%)2.008s (~)0.644s151.00x
💻 LocalNext.js (Turbopack)1.388s (-0.6%)2.012s (~)0.624s151.02x
💻 LocalExpress1.409s (+1.5%)2.006s (~)0.597s151.03x
💻 LocalNitro1.416s (~)2.005s (~)0.589s151.04x
🐘 PostgresNext.js (Turbopack)1.782s (+1.0%)2.016s (~)0.234s151.31x
🌐 MongoDBNext.js (Turbopack)2.127s (-1.3%)3.012s (~)0.886s101.56x
🌐 TursoNext.js (Turbopack)2.235s (+1.1%)3.016s (~)0.781s101.64x
🐘 PostgresExpress2.270s (+1.1%)3.013s (+6.5% 🔺)0.743s101.67x
🐘 PostgresNitro2.494s (+5.9% 🔺)3.012s (~)0.519s101.83x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express2.899s (-11.3% 🟢)3.762s (-8.6% 🟢)0.863s81.00x
▲ VercelNext.js (Turbopack)3.126s (-2.8%)3.818s (-5.4% 🟢)0.692s81.08x
▲ VercelNitro3.531s (+10.3% 🔺)4.461s (+16.6% 🔺)0.930s71.22x

🔍 Observability: Express | Next.js (Turbopack) | Nitro

Promise.all with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Express2.154s (~)3.125s (~)0.971s101.00x
💻 LocalNext.js (Turbopack)2.207s (+6.6% 🔺)3.153s (+11.2% 🔺)0.946s101.02x
💻 LocalNitro2.257s (+3.3%)3.195s (+2.3%)0.938s101.05x
🌐 StarterNext.js (Turbopack)2.481s (+1.8%)3.010s (~)0.529s101.15x
🌐 RedisNext.js (Turbopack)2.481s (~)3.013s (~)0.532s101.15x
🐘 PostgresNext.js (Turbopack)2.487s (-1.7%)3.017s (~)0.530s101.15x
🐘 PostgresNitro2.903s (-2.7%)3.012s (-10.2% 🟢)0.108s101.35x
🐘 PostgresExpress3.029s (+23.6% 🔺)3.583s (+19.0% 🔺)0.554s91.41x
🌐 MongoDBNext.js (Turbopack)4.617s (~)5.181s (~)0.564s62.14x
🌐 TursoNext.js (Turbopack)4.768s (+2.2%)5.184s (~)0.416s62.21x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro3.497s (-2.5%)3.933s (-19.4% 🟢)0.435s81.00x
▲ VercelExpress3.764s (-7.1% 🟢)4.574s (-2.9%)0.811s71.08x
▲ VercelNext.js (Turbopack)3.954s (+12.1% 🔺)4.614s (+4.4%)0.660s71.13x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

Promise.race with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🌐 Starter🥇 Next.js (Turbopack)1.380s (+2.1%)2.008s (~)0.628s151.00x
🌐 RedisNext.js (Turbopack)1.381s (+1.4%)2.010s (~)0.629s151.00x
💻 LocalNext.js (Turbopack)1.405s (+0.8%)2.013s (~)0.608s151.02x
💻 LocalExpress1.409s (+0.9%)2.006s (~)0.597s151.02x
💻 LocalNitro1.426s (+0.9%)2.005s (~)0.579s151.03x
🐘 PostgresNitro1.669s (-12.6% 🟢)2.010s (~)0.341s151.21x
🐘 PostgresNext.js (Turbopack)1.681s (~)2.012s (~)0.331s151.22x
🐘 PostgresExpress1.852s (+4.1%)2.009s (~)0.158s151.34x
🌐 MongoDBNext.js (Turbopack)2.178s (+1.4%)3.011s (~)0.833s101.58x
🌐 TursoNext.js (Turbopack)2.208s (~)3.014s (~)0.806s101.60x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro2.936s (+5.1% 🔺)3.642s (+1.0%)0.706s91.00x
▲ VercelExpress3.054s (+3.3%)3.979s (+3.1%)0.925s81.04x
▲ VercelNext.js (Turbopack)3.084s (+9.5% 🔺)3.870s (+3.8%)0.785s81.05x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

Promise.race with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Express2.208s (+1.2%)3.162s (~)0.954s101.00x
💻 LocalNext.js (Turbopack)2.244s (+3.7%)3.188s (+6.9% 🔺)0.944s101.02x
💻 LocalNitro2.250s (+1.8%)3.196s (+1.3%)0.946s101.02x
🌐 RedisNext.js (Turbopack)2.478s (+0.5%)3.014s (~)0.536s101.12x
🌐 StarterNext.js (Turbopack)2.518s (+1.9%)3.053s (+1.5%)0.535s101.14x
🐘 PostgresNext.js (Turbopack)2.554s (+2.6%)3.024s (~)0.471s101.16x
🐘 PostgresExpress2.556s (-1.4%)3.015s (~)0.460s101.16x
🐘 PostgresNitro2.881s (+8.8% 🔺)3.123s (+3.7%)0.242s101.30x
🌐 MongoDBNext.js (Turbopack)4.669s (-0.9%)5.180s (~)0.511s62.11x
🌐 TursoNext.js (Turbopack)4.803s (+3.7%)5.182s (~)0.379s62.17x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express3.200s (-15.6% 🟢)3.896s (-11.3% 🟢)0.696s81.00x
▲ VercelNext.js (Turbopack)3.438s (-6.0% 🟢)4.099s (-5.3% 🟢)0.661s81.07x
▲ VercelNitro3.752s (+10.3% 🔺)4.560s (+9.1% 🔺)0.808s71.17x

🔍 Observability: Express | Next.js (Turbopack) | Nitro

Stream Benchmarks(includes TTFB metrics)
workflow with stream

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🌐 Starter🥇 Next.js (Turbopack)0.141s (+12.4% 🔺)1.006s (~)0.000s (~)1.013s (~)0.871s101.00x
🌐 RedisNext.js (Turbopack)0.151s (+4.9%)1.005s (~)0.000s (+Infinity% 🔺)1.014s (~)0.864s101.07x
💻 LocalNext.js (Turbopack)0.151s (+8.3% 🔺)1.003s (~)0.017s (-2.8%)1.028s (~)0.877s101.07x
💻 LocalExpress0.175s (+0.6%)0.992s (~)0.018s (+11.4% 🔺)1.024s (~)0.849s101.24x
💻 LocalNitro0.182s (+2.9%)0.992s (~)0.016s (-2.4%)1.022s (~)0.840s101.29x
🌐 MongoDBNext.js (Turbopack)0.482s (-7.5% 🟢)0.964s (+3.8%)0.000s (+Infinity% 🔺)1.013s (~)0.530s103.41x
🌐 TursoNext.js (Turbopack)0.525s (+2.7%)0.930s (-0.7%)0.000s (NaN%)1.014s (~)0.489s103.72x
🐘 PostgresNext.js (Turbopack)0.696s (-41.2% 🟢)0.857s (-44.2% 🟢)0.000s (NaN%)1.016s (-41.2% 🟢)0.319s104.93x
🐘 PostgresExpress2.233s (-6.9% 🟢)2.809s (+6.2% 🔺)0.000s (NaN%)3.015s (~)0.781s1015.80x
🐘 PostgresNitro2.422s (+9.0% 🔺)2.621s (-7.2% 🟢)0.000s (-100.0% 🟢)3.013s (~)0.591s1017.14x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)2.743s (-12.9% 🟢)3.301s (-8.3% 🟢)0.547s (+10.5% 🔺)4.287s (-6.9% 🟢)1.543s101.00x
▲ VercelNitro2.838s (-2.5%)3.153s (-4.8%)0.390s (-10.5% 🟢)4.017s (-4.7%)1.179s101.03x
▲ VercelExpress2.964s (~)3.372s (+4.5%)0.471s (+16.9% 🔺)4.415s (+5.5% 🔺)1.452s101.08x

🔍 Observability: Next.js (Turbopack) | Nitro | Express

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World🥇 Fastest FrameworkWins
💻 LocalNext.js (Turbopack)6/8
🐘 PostgresNext.js (Turbopack)6/8
▲ VercelNitro4/8
Fastest World by Framework

Winner determined by most benchmark wins

Framework🥇 Fastest WorldWins
Express💻 Local8/8
Next.js (Turbopack)🌐 Starter4/8
Nitro💻 Local8/8
Column Definitions
  • Workflow Time: Runtime reported by workflow (completedAt - createdAt) - primary metric
  • TTFB: Time to First Byte - time from workflow start until first stream byte received (stream benchmarks only)
  • Slurp: Time from first byte to complete stream consumption (stream benchmarks only)
  • Wall Time: Total testbench time (trigger workflow + poll for result)
  • Overhead: Testbench overhead (Wall Time - Workflow Time)
  • Samples: Number of benchmark iterations run
  • vs Fastest: How much slower compared to the fastest configuration for this benchmark

Worlds:

  • 💻 Local: In-memory filesystem world (local development)
  • 🐘 Postgres: PostgreSQL database world (local development)
  • ▲ Vercel: Vercel production/preview deployment
  • 🌐 Starter: Community world (local development)
  • 🌐 Turso: Community world (local development)
  • 🌐 MongoDB: Community world (local development)
  • 🌐 Redis: Community world (local development)
  • 🌐 Jazz: Community world (local development)

📋 View full workflow run

Comment threadpackages/cli/src/lib/inspect/setup.ts Outdated
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
vercel[bot]

This comment was marked as resolved.

Comment threadpackages/cli/src/lib/update-check.ts
vercelBotand others added 5 commits December 30, 2025 10:10
…me using `createRequire` with a relative path. When bundled by Vite/SvelteKit for SSR, the relative path becomes invalid because the output file is at a different location than the source file, causing a MODULE_NOT_FOUND error. The fix uses `import.meta.resolve()` which provides correct path resolution even in bundled environments.
This commit fixes the issue reported at packages/world-local/src/init.ts:1-18
## SvelteKit build fails: Cannot find module '../package.json' in bundled SSR code
**What fails:** During SvelteKit SSR build, the `vite build` command fails with error: `Error: Cannot find module '../package.json'` in compiled code at `.svelte-kit/output/server/chunks/step-handler.js:1711:21`
**How to reproduce:**
```bash
cd workbench/sveltekit
pnpm run build
```
During the "rendering chunks" phase, when Vite bundles the SSR output, the compiled code attempts to require `../package.json` which fails because the relative path from the bundled output file location is invalid.
**Result:**
```
Error: Cannot find module '../package.json'
Require stack:
- /vercel/path0/workbench/sveltekit/.svelte-kit/output/server/chunks/step-handler.js
```
**Root cause:** The `packages/world-local/src/init.ts` file uses `createRequire(import.meta.url)` with a relative path `../package.json` to load the package.json file. When Rollup/Vite bundles this code for SSR, the relative path becomes invalid because the output file is at a different location than the source file.
**Solution:** Use `import.meta.resolve()` which provides proper module path resolution even in bundled environments. Falls back to `createRequire()` for compatibility with test environments where `import.meta.resolve()` may not be available.
Co-authored-by: Vercel <vercel[bot]@users.noreply.github.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Comment threadpackages/cli/src/lib/update-check.ts Outdated
VaguelySeriousand others added 4 commits January 2, 2026 14:40
Co-authored-by: vercel[bot] <35613825+vercel[bot]@users.noreply.github.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@VaguelySerious@pranaygp
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[cli] Print notice on CLI startup when detecting an outdated version - #701

Merged
VaguelySerious merged 17 commits into
mainfrom
peter/cli-check-for-updates-manual
Jan 2, 2026
Merged

[cli] Print notice on CLI startup when detecting an outdated version#701
VaguelySerious merged 17 commits into
mainfrom
peter/cli-check-for-updates-manual

Conversation

@VaguelySerious

@VaguelySeriousVaguelySerious commented Dec 29, 2025

Copy link
Copy Markdown
Member

This superseeds #657, which tried to use an npm plugin for this job, but was ugly and didn't work with pre-release versions, so I had claude implement it instead.

Essentially:

  • First time you run the CLI it'll do a sync check to npm (failures being ignored) for new version, caching this for 3 days
  • Update note will be displayed in message header on every invocation in interactive mode, where we would usually just display the version
    • This might not be good enough for notifying users consistently. If this code seems good, I can extract it into utils, and also import it in the builder code to print during build in a shorter format.
  • Changing the package version busts the cache, so upgrading will reset the cache
  • i.e. also users who upgrade to latest won't see the "new version is available" note until at the earliest 3 day after that
  • The message may be off if someone installs @workflow/cli globally separately from workflow, since p i workflow@latest wouldn't resolve the update warning, but this seems like a minor concern.
image

Signed-off-by: Peter Wielander <mittgfu@gmail.com>
@vercel

vercelBot commented Dec 29, 2025

Copy link
Copy Markdown
Contributor

@changeset-bot

changeset-botBot commented Dec 29, 2025

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 3d0d66e

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

This PR includes changesets to release 4 packages
NameType
@workflow/cliPatch
workflowPatch
@workflow/world-testingPatch
@workflow/aiPatch

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

@github-actions

github-actionsBot commented Dec 29, 2025

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

Some tests failed

Summary

PassedFailedSkippedTotal
✅ ▲ Vercel Production308011319
✅ 💻 Local Development28208290
✅ 📦 Local Production28208290
✅ 🐘 Local Postgres28208290
✅ 🪟 Windows290029
❌ 🌍 Community Worlds117110128
Total130011351346

❌ Failed Tests

🌍 Community Worlds (11 failed)

mongodb (1 failed):

  • webhookWorkflow

starter (9 failed):

  • addTenWorkflow
  • addTenWorkflow
  • retryAttemptCounterWorkflow
  • crossFileErrorWorkflow - stack traces work across imported modules
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly

turso (1 failed):

  • webhookWorkflow

Details by Category

✅ ▲ Vercel Production
AppPassedFailedSkipped
✅ astro2801
✅ example2801
✅ express2801
✅ fastify2801
✅ hono2801
✅ nextjs-turbopack2801
✅ nextjs-webpack2801
✅ nitro2801
✅ nuxt2801
✅ sveltekit2801
✅ vite2801
✅ 💻 Local Development
AppPassedFailedSkipped
✅ astro-stable2801
✅ express-stable2801
✅ fastify-stable2801
✅ hono-stable2801
✅ nextjs-turbopack-stable2900
✅ nextjs-webpack-stable2900
✅ nitro-stable2801
✅ nuxt-stable2801
✅ sveltekit-stable2801
✅ vite-stable2801
✅ 📦 Local Production
AppPassedFailedSkipped
✅ astro-stable2801
✅ express-stable2801
✅ fastify-stable2801
✅ hono-stable2801
✅ nextjs-turbopack-stable2900
✅ nextjs-webpack-stable2900
✅ nitro-stable2801
✅ nuxt-stable2801
✅ sveltekit-stable2801
✅ vite-stable2801
✅ 🐘 Local Postgres
AppPassedFailedSkipped
✅ astro-stable2801
✅ express-stable2801
✅ fastify-stable2801
✅ hono-stable2801
✅ nextjs-turbopack-stable2900
✅ nextjs-webpack-stable2900
✅ nitro-stable2801
✅ nuxt-stable2801
✅ sveltekit-stable2801
✅ vite-stable2801
✅ 🪟 Windows
AppPassedFailedSkipped
✅ nextjs-turbopack2900
❌ 🌍 Community Worlds
AppPassedFailedSkipped
✅ mongodb-dev300
❌ mongodb2810
✅ redis-dev300
✅ redis2900
✅ starter-dev300
❌ starter2090
✅ turso-dev300
❌ turso2810

📋 View full workflow run

@github-actions

github-actionsBot commented Dec 29, 2025

Copy link
Copy Markdown
Contributor

📊 Benchmark Results

📈 Comparing against baseline from main branch. Green 🟢 = faster, Red 🔺 = slower.

workflow with no steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)0.039s (+5.1% 🔺)1.014s (~)0.975s101.00x
🌐 StarterNext.js (Turbopack)0.040s (+8.6% 🔺)1.015s (~)0.974s101.03x
🌐 RedisNext.js (Turbopack)0.041s (+1.2%)1.017s (~)0.975s101.05x
💻 LocalExpress0.043s (-1.4%)1.007s (~)0.964s101.09x
💻 LocalNitro0.044s (~)1.006s (~)0.962s101.14x
🌐 TursoNext.js (Turbopack)0.102s (~)1.015s (~)0.913s102.60x
🌐 MongoDBNext.js (Turbopack)0.108s (+7.5% 🔺)1.014s (~)0.906s102.77x
🐘 PostgresExpress0.208s (-44.5% 🟢)1.014s (~)0.806s105.30x
🐘 PostgresNext.js (Turbopack)0.215s (-10.8% 🟢)1.019s (~)0.804s105.48x
🐘 PostgresNitro0.406s (+29.8% 🔺)1.012s (~)0.606s1010.35x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)0.535s (-11.0% 🟢)2.450s (+53.0% 🔺)1.914s101.00x
▲ VercelExpress0.635s (-16.3% 🟢)1.869s (+1.6%)1.234s101.19x
▲ VercelNitro0.725s (-35.1% 🟢)1.719s (-14.0% 🟢)0.994s101.35x

🔍 Observability: Next.js (Turbopack) | Express | Nitro

workflow with 1 step

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🌐 Starter🥇 Next.js (Turbopack)1.090s (~)2.010s (~)0.920s101.00x
💻 LocalNext.js (Turbopack)1.091s (-0.5%)2.011s (~)0.920s101.00x
🌐 RedisNext.js (Turbopack)1.107s (~)2.012s (~)0.905s101.02x
💻 LocalExpress1.110s (~)2.007s (~)0.896s101.02x
💻 LocalNitro1.114s (~)2.006s (~)0.892s101.02x
🌐 MongoDBNext.js (Turbopack)1.310s (~)2.012s (~)0.702s101.20x
🌐 TursoNext.js (Turbopack)1.310s (+0.7%)2.013s (~)0.703s101.20x
🐘 PostgresNext.js (Turbopack)1.639s (-10.8% 🟢)2.015s (~)0.376s101.50x
🐘 PostgresExpress2.260s (+1.3%)3.014s (~)0.754s102.07x
🐘 PostgresNitro2.285s (+7.7% 🔺)3.012s (~)0.727s102.10x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro2.680s (-3.0%)3.575s (-2.3%)0.896s101.00x
▲ VercelExpress3.185s (~)4.180s (+0.9%)0.995s101.19x
▲ VercelNext.js (Turbopack)3.223s (+17.8% 🔺)4.131s (+12.9% 🔺)0.908s101.20x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

workflow with 10 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🌐 Starter🥇 Next.js (Turbopack)10.627s (~)11.013s (~)0.385s51.00x
💻 LocalNext.js (Turbopack)10.667s (~)11.019s (~)0.352s51.00x
🌐 RedisNext.js (Turbopack)10.687s (~)11.019s (~)0.332s51.01x
💻 LocalExpress10.771s (~)11.012s (~)0.241s51.01x
💻 LocalNitro10.801s (~)11.012s (~)0.212s51.02x
🌐 MongoDBNext.js (Turbopack)12.178s (~)13.021s (~)0.842s51.15x
🌐 TursoNext.js (Turbopack)12.196s (~)13.038s (~)0.842s51.15x
🐘 PostgresNext.js (Turbopack)14.119s (-5.6% 🟢)14.429s (-7.7% 🟢)0.310s51.33x
🐘 PostgresNitro20.219s (-1.0%)21.040s (~)0.820s51.90x
🐘 PostgresExpress20.436s (+0.8%)21.032s (~)0.596s51.92x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro22.176s (-4.8%)23.160s (-2.6%)0.984s51.00x
▲ VercelExpress22.764s (-1.2%)23.376s (-0.9%)0.612s51.03x
▲ VercelNext.js (Turbopack)22.987s (~)23.791s (~)0.804s51.04x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

Promise.all with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🌐 Redis🥇 Next.js (Turbopack)1.363s (+0.9%)2.010s (~)0.647s151.00x
🌐 StarterNext.js (Turbopack)1.364s (+1.8%)2.008s (~)0.644s151.00x
💻 LocalNext.js (Turbopack)1.388s (-0.6%)2.012s (~)0.624s151.02x
💻 LocalExpress1.409s (+1.5%)2.006s (~)0.597s151.03x
💻 LocalNitro1.416s (~)2.005s (~)0.589s151.04x
🐘 PostgresNext.js (Turbopack)1.782s (+1.0%)2.016s (~)0.234s151.31x
🌐 MongoDBNext.js (Turbopack)2.127s (-1.3%)3.012s (~)0.886s101.56x
🌐 TursoNext.js (Turbopack)2.235s (+1.1%)3.016s (~)0.781s101.64x
🐘 PostgresExpress2.270s (+1.1%)3.013s (+6.5% 🔺)0.743s101.67x
🐘 PostgresNitro2.494s (+5.9% 🔺)3.012s (~)0.519s101.83x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express2.899s (-11.3% 🟢)3.762s (-8.6% 🟢)0.863s81.00x
▲ VercelNext.js (Turbopack)3.126s (-2.8%)3.818s (-5.4% 🟢)0.692s81.08x
▲ VercelNitro3.531s (+10.3% 🔺)4.461s (+16.6% 🔺)0.930s71.22x

🔍 Observability: Express | Next.js (Turbopack) | Nitro

Promise.all with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Express2.154s (~)3.125s (~)0.971s101.00x
💻 LocalNext.js (Turbopack)2.207s (+6.6% 🔺)3.153s (+11.2% 🔺)0.946s101.02x
💻 LocalNitro2.257s (+3.3%)3.195s (+2.3%)0.938s101.05x
🌐 StarterNext.js (Turbopack)2.481s (+1.8%)3.010s (~)0.529s101.15x
🌐 RedisNext.js (Turbopack)2.481s (~)3.013s (~)0.532s101.15x
🐘 PostgresNext.js (Turbopack)2.487s (-1.7%)3.017s (~)0.530s101.15x
🐘 PostgresNitro2.903s (-2.7%)3.012s (-10.2% 🟢)0.108s101.35x
🐘 PostgresExpress3.029s (+23.6% 🔺)3.583s (+19.0% 🔺)0.554s91.41x
🌐 MongoDBNext.js (Turbopack)4.617s (~)5.181s (~)0.564s62.14x
🌐 TursoNext.js (Turbopack)4.768s (+2.2%)5.184s (~)0.416s62.21x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro3.497s (-2.5%)3.933s (-19.4% 🟢)0.435s81.00x
▲ VercelExpress3.764s (-7.1% 🟢)4.574s (-2.9%)0.811s71.08x
▲ VercelNext.js (Turbopack)3.954s (+12.1% 🔺)4.614s (+4.4%)0.660s71.13x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

Promise.race with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🌐 Starter🥇 Next.js (Turbopack)1.380s (+2.1%)2.008s (~)0.628s151.00x
🌐 RedisNext.js (Turbopack)1.381s (+1.4%)2.010s (~)0.629s151.00x
💻 LocalNext.js (Turbopack)1.405s (+0.8%)2.013s (~)0.608s151.02x
💻 LocalExpress1.409s (+0.9%)2.006s (~)0.597s151.02x
💻 LocalNitro1.426s (+0.9%)2.005s (~)0.579s151.03x
🐘 PostgresNitro1.669s (-12.6% 🟢)2.010s (~)0.341s151.21x
🐘 PostgresNext.js (Turbopack)1.681s (~)2.012s (~)0.331s151.22x
🐘 PostgresExpress1.852s (+4.1%)2.009s (~)0.158s151.34x
🌐 MongoDBNext.js (Turbopack)2.178s (+1.4%)3.011s (~)0.833s101.58x
🌐 TursoNext.js (Turbopack)2.208s (~)3.014s (~)0.806s101.60x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro2.936s (+5.1% 🔺)3.642s (+1.0%)0.706s91.00x
▲ VercelExpress3.054s (+3.3%)3.979s (+3.1%)0.925s81.04x
▲ VercelNext.js (Turbopack)3.084s (+9.5% 🔺)3.870s (+3.8%)0.785s81.05x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

Promise.race with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Express2.208s (+1.2%)3.162s (~)0.954s101.00x
💻 LocalNext.js (Turbopack)2.244s (+3.7%)3.188s (+6.9% 🔺)0.944s101.02x
💻 LocalNitro2.250s (+1.8%)3.196s (+1.3%)0.946s101.02x
🌐 RedisNext.js (Turbopack)2.478s (+0.5%)3.014s (~)0.536s101.12x
🌐 StarterNext.js (Turbopack)2.518s (+1.9%)3.053s (+1.5%)0.535s101.14x
🐘 PostgresNext.js (Turbopack)2.554s (+2.6%)3.024s (~)0.471s101.16x
🐘 PostgresExpress2.556s (-1.4%)3.015s (~)0.460s101.16x
🐘 PostgresNitro2.881s (+8.8% 🔺)3.123s (+3.7%)0.242s101.30x
🌐 MongoDBNext.js (Turbopack)4.669s (-0.9%)5.180s (~)0.511s62.11x
🌐 TursoNext.js (Turbopack)4.803s (+3.7%)5.182s (~)0.379s62.17x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express3.200s (-15.6% 🟢)3.896s (-11.3% 🟢)0.696s81.00x
▲ VercelNext.js (Turbopack)3.438s (-6.0% 🟢)4.099s (-5.3% 🟢)0.661s81.07x
▲ VercelNitro3.752s (+10.3% 🔺)4.560s (+9.1% 🔺)0.808s71.17x

🔍 Observability: Express | Next.js (Turbopack) | Nitro

Stream Benchmarks(includes TTFB metrics)
workflow with stream

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🌐 Starter🥇 Next.js (Turbopack)0.141s (+12.4% 🔺)1.006s (~)0.000s (~)1.013s (~)0.871s101.00x
🌐 RedisNext.js (Turbopack)0.151s (+4.9%)1.005s (~)0.000s (+Infinity% 🔺)1.014s (~)0.864s101.07x
💻 LocalNext.js (Turbopack)0.151s (+8.3% 🔺)1.003s (~)0.017s (-2.8%)1.028s (~)0.877s101.07x
💻 LocalExpress0.175s (+0.6%)0.992s (~)0.018s (+11.4% 🔺)1.024s (~)0.849s101.24x
💻 LocalNitro0.182s (+2.9%)0.992s (~)0.016s (-2.4%)1.022s (~)0.840s101.29x
🌐 MongoDBNext.js (Turbopack)0.482s (-7.5% 🟢)0.964s (+3.8%)0.000s (+Infinity% 🔺)1.013s (~)0.530s103.41x
🌐 TursoNext.js (Turbopack)0.525s (+2.7%)0.930s (-0.7%)0.000s (NaN%)1.014s (~)0.489s103.72x
🐘 PostgresNext.js (Turbopack)0.696s (-41.2% 🟢)0.857s (-44.2% 🟢)0.000s (NaN%)1.016s (-41.2% 🟢)0.319s104.93x
🐘 PostgresExpress2.233s (-6.9% 🟢)2.809s (+6.2% 🔺)0.000s (NaN%)3.015s (~)0.781s1015.80x
🐘 PostgresNitro2.422s (+9.0% 🔺)2.621s (-7.2% 🟢)0.000s (-100.0% 🟢)3.013s (~)0.591s1017.14x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)2.743s (-12.9% 🟢)3.301s (-8.3% 🟢)0.547s (+10.5% 🔺)4.287s (-6.9% 🟢)1.543s101.00x
▲ VercelNitro2.838s (-2.5%)3.153s (-4.8%)0.390s (-10.5% 🟢)4.017s (-4.7%)1.179s101.03x
▲ VercelExpress2.964s (~)3.372s (+4.5%)0.471s (+16.9% 🔺)4.415s (+5.5% 🔺)1.452s101.08x

🔍 Observability: Next.js (Turbopack) | Nitro | Express

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World🥇 Fastest FrameworkWins
💻 LocalNext.js (Turbopack)6/8
🐘 PostgresNext.js (Turbopack)6/8
▲ VercelNitro4/8
Fastest World by Framework

Winner determined by most benchmark wins

Framework🥇 Fastest WorldWins
Express💻 Local8/8
Next.js (Turbopack)🌐 Starter4/8
Nitro💻 Local8/8
Column Definitions
  • Workflow Time: Runtime reported by workflow (completedAt - createdAt) - primary metric
  • TTFB: Time to First Byte - time from workflow start until first stream byte received (stream benchmarks only)
  • Slurp: Time from first byte to complete stream consumption (stream benchmarks only)
  • Wall Time: Total testbench time (trigger workflow + poll for result)
  • Overhead: Testbench overhead (Wall Time - Workflow Time)
  • Samples: Number of benchmark iterations run
  • vs Fastest: How much slower compared to the fastest configuration for this benchmark

Worlds:

  • 💻 Local: In-memory filesystem world (local development)
  • 🐘 Postgres: PostgreSQL database world (local development)
  • ▲ Vercel: Vercel production/preview deployment
  • 🌐 Starter: Community world (local development)
  • 🌐 Turso: Community world (local development)
  • 🌐 MongoDB: Community world (local development)
  • 🌐 Redis: Community world (local development)
  • 🌐 Jazz: Community world (local development)

📋 View full workflow run

Comment threadpackages/cli/src/lib/inspect/setup.ts Outdated
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
vercel[bot]

This comment was marked as resolved.

Comment threadpackages/cli/src/lib/update-check.ts
vercelBotand others added 5 commits December 30, 2025 10:10
…me using `createRequire` with a relative path. When bundled by Vite/SvelteKit for SSR, the relative path becomes invalid because the output file is at a different location than the source file, causing a MODULE_NOT_FOUND error. The fix uses `import.meta.resolve()` which provides correct path resolution even in bundled environments.
This commit fixes the issue reported at packages/world-local/src/init.ts:1-18
## SvelteKit build fails: Cannot find module '../package.json' in bundled SSR code
**What fails:** During SvelteKit SSR build, the `vite build` command fails with error: `Error: Cannot find module '../package.json'` in compiled code at `.svelte-kit/output/server/chunks/step-handler.js:1711:21`
**How to reproduce:**
```bash
cd workbench/sveltekit
pnpm run build
```
During the "rendering chunks" phase, when Vite bundles the SSR output, the compiled code attempts to require `../package.json` which fails because the relative path from the bundled output file location is invalid.
**Result:**
```
Error: Cannot find module '../package.json'
Require stack:
- /vercel/path0/workbench/sveltekit/.svelte-kit/output/server/chunks/step-handler.js
```
**Root cause:** The `packages/world-local/src/init.ts` file uses `createRequire(import.meta.url)` with a relative path `../package.json` to load the package.json file. When Rollup/Vite bundles this code for SSR, the relative path becomes invalid because the output file is at a different location than the source file.
**Solution:** Use `import.meta.resolve()` which provides proper module path resolution even in bundled environments. Falls back to `createRequire()` for compatibility with test environments where `import.meta.resolve()` may not be available.
Co-authored-by: Vercel <vercel[bot]@users.noreply.github.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Comment threadpackages/cli/src/lib/update-check.ts Outdated
VaguelySeriousand others added 4 commits January 2, 2026 14:40
Co-authored-by: vercel[bot] <35613825+vercel[bot]@users.noreply.github.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@VaguelySerious@pranaygp
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

[cli] Print notice on CLI startup when detecting an outdated version - #701

Merged
VaguelySerious merged 17 commits into
mainfrom
peter/cli-check-for-updates-manual
Jan 2, 2026
Merged

[cli] Print notice on CLI startup when detecting an outdated version#701
VaguelySerious merged 17 commits into
mainfrom
peter/cli-check-for-updates-manual

Conversation

@VaguelySerious

@VaguelySeriousVaguelySerious commented Dec 29, 2025

Copy link
Copy Markdown
Member

This superseeds #657, which tried to use an npm plugin for this job, but was ugly and didn't work with pre-release versions, so I had claude implement it instead.

Essentially:

  • First time you run the CLI it'll do a sync check to npm (failures being ignored) for new version, caching this for 3 days
  • Update note will be displayed in message header on every invocation in interactive mode, where we would usually just display the version
    • This might not be good enough for notifying users consistently. If this code seems good, I can extract it into utils, and also import it in the builder code to print during build in a shorter format.
  • Changing the package version busts the cache, so upgrading will reset the cache
  • i.e. also users who upgrade to latest won't see the "new version is available" note until at the earliest 3 day after that
  • The message may be off if someone installs @workflow/cli globally separately from workflow, since p i workflow@latest wouldn't resolve the update warning, but this seems like a minor concern.
image

Signed-off-by: Peter Wielander <mittgfu@gmail.com>
@vercel

vercelBot commented Dec 29, 2025

Copy link
Copy Markdown
Contributor

@changeset-bot

changeset-botBot commented Dec 29, 2025

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 3d0d66e

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

This PR includes changesets to release 4 packages
NameType
@workflow/cliPatch
workflowPatch
@workflow/world-testingPatch
@workflow/aiPatch

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

@github-actions

github-actionsBot commented Dec 29, 2025

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

Some tests failed

Summary

PassedFailedSkippedTotal
✅ ▲ Vercel Production308011319
✅ 💻 Local Development28208290
✅ 📦 Local Production28208290
✅ 🐘 Local Postgres28208290
✅ 🪟 Windows290029
❌ 🌍 Community Worlds117110128
Total130011351346

❌ Failed Tests

🌍 Community Worlds (11 failed)

mongodb (1 failed):

  • webhookWorkflow

starter (9 failed):

  • addTenWorkflow
  • addTenWorkflow
  • retryAttemptCounterWorkflow
  • crossFileErrorWorkflow - stack traces work across imported modules
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly

turso (1 failed):

  • webhookWorkflow

Details by Category

✅ ▲ Vercel Production
AppPassedFailedSkipped
✅ astro2801
✅ example2801
✅ express2801
✅ fastify2801
✅ hono2801
✅ nextjs-turbopack2801
✅ nextjs-webpack2801
✅ nitro2801
✅ nuxt2801
✅ sveltekit2801
✅ vite2801
✅ 💻 Local Development
AppPassedFailedSkipped
✅ astro-stable2801
✅ express-stable2801
✅ fastify-stable2801
✅ hono-stable2801
✅ nextjs-turbopack-stable2900
✅ nextjs-webpack-stable2900
✅ nitro-stable2801
✅ nuxt-stable2801
✅ sveltekit-stable2801
✅ vite-stable2801
✅ 📦 Local Production
AppPassedFailedSkipped
✅ astro-stable2801
✅ express-stable2801
✅ fastify-stable2801
✅ hono-stable2801
✅ nextjs-turbopack-stable2900
✅ nextjs-webpack-stable2900
✅ nitro-stable2801
✅ nuxt-stable2801
✅ sveltekit-stable2801
✅ vite-stable2801
✅ 🐘 Local Postgres
AppPassedFailedSkipped
✅ astro-stable2801
✅ express-stable2801
✅ fastify-stable2801
✅ hono-stable2801
✅ nextjs-turbopack-stable2900
✅ nextjs-webpack-stable2900
✅ nitro-stable2801
✅ nuxt-stable2801
✅ sveltekit-stable2801
✅ vite-stable2801
✅ 🪟 Windows
AppPassedFailedSkipped
✅ nextjs-turbopack2900
❌ 🌍 Community Worlds
AppPassedFailedSkipped
✅ mongodb-dev300
❌ mongodb2810
✅ redis-dev300
✅ redis2900
✅ starter-dev300
❌ starter2090
✅ turso-dev300
❌ turso2810

📋 View full workflow run

@github-actions

github-actionsBot commented Dec 29, 2025

Copy link
Copy Markdown
Contributor

📊 Benchmark Results

📈 Comparing against baseline from main branch. Green 🟢 = faster, Red 🔺 = slower.

workflow with no steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)0.039s (+5.1% 🔺)1.014s (~)0.975s101.00x
🌐 StarterNext.js (Turbopack)0.040s (+8.6% 🔺)1.015s (~)0.974s101.03x
🌐 RedisNext.js (Turbopack)0.041s (+1.2%)1.017s (~)0.975s101.05x
💻 LocalExpress0.043s (-1.4%)1.007s (~)0.964s101.09x
💻 LocalNitro0.044s (~)1.006s (~)0.962s101.14x
🌐 TursoNext.js (Turbopack)0.102s (~)1.015s (~)0.913s102.60x
🌐 MongoDBNext.js (Turbopack)0.108s (+7.5% 🔺)1.014s (~)0.906s102.77x
🐘 PostgresExpress0.208s (-44.5% 🟢)1.014s (~)0.806s105.30x
🐘 PostgresNext.js (Turbopack)0.215s (-10.8% 🟢)1.019s (~)0.804s105.48x
🐘 PostgresNitro0.406s (+29.8% 🔺)1.012s (~)0.606s1010.35x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)0.535s (-11.0% 🟢)2.450s (+53.0% 🔺)1.914s101.00x
▲ VercelExpress0.635s (-16.3% 🟢)1.869s (+1.6%)1.234s101.19x
▲ VercelNitro0.725s (-35.1% 🟢)1.719s (-14.0% 🟢)0.994s101.35x

🔍 Observability: Next.js (Turbopack) | Express | Nitro

workflow with 1 step

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🌐 Starter🥇 Next.js (Turbopack)1.090s (~)2.010s (~)0.920s101.00x
💻 LocalNext.js (Turbopack)1.091s (-0.5%)2.011s (~)0.920s101.00x
🌐 RedisNext.js (Turbopack)1.107s (~)2.012s (~)0.905s101.02x
💻 LocalExpress1.110s (~)2.007s (~)0.896s101.02x
💻 LocalNitro1.114s (~)2.006s (~)0.892s101.02x
🌐 MongoDBNext.js (Turbopack)1.310s (~)2.012s (~)0.702s101.20x
🌐 TursoNext.js (Turbopack)1.310s (+0.7%)2.013s (~)0.703s101.20x
🐘 PostgresNext.js (Turbopack)1.639s (-10.8% 🟢)2.015s (~)0.376s101.50x
🐘 PostgresExpress2.260s (+1.3%)3.014s (~)0.754s102.07x
🐘 PostgresNitro2.285s (+7.7% 🔺)3.012s (~)0.727s102.10x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro2.680s (-3.0%)3.575s (-2.3%)0.896s101.00x
▲ VercelExpress3.185s (~)4.180s (+0.9%)0.995s101.19x
▲ VercelNext.js (Turbopack)3.223s (+17.8% 🔺)4.131s (+12.9% 🔺)0.908s101.20x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

workflow with 10 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🌐 Starter🥇 Next.js (Turbopack)10.627s (~)11.013s (~)0.385s51.00x
💻 LocalNext.js (Turbopack)10.667s (~)11.019s (~)0.352s51.00x
🌐 RedisNext.js (Turbopack)10.687s (~)11.019s (~)0.332s51.01x
💻 LocalExpress10.771s (~)11.012s (~)0.241s51.01x
💻 LocalNitro10.801s (~)11.012s (~)0.212s51.02x
🌐 MongoDBNext.js (Turbopack)12.178s (~)13.021s (~)0.842s51.15x
🌐 TursoNext.js (Turbopack)12.196s (~)13.038s (~)0.842s51.15x
🐘 PostgresNext.js (Turbopack)14.119s (-5.6% 🟢)14.429s (-7.7% 🟢)0.310s51.33x
🐘 PostgresNitro20.219s (-1.0%)21.040s (~)0.820s51.90x
🐘 PostgresExpress20.436s (+0.8%)21.032s (~)0.596s51.92x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro22.176s (-4.8%)23.160s (-2.6%)0.984s51.00x
▲ VercelExpress22.764s (-1.2%)23.376s (-0.9%)0.612s51.03x
▲ VercelNext.js (Turbopack)22.987s (~)23.791s (~)0.804s51.04x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

Promise.all with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🌐 Redis🥇 Next.js (Turbopack)1.363s (+0.9%)2.010s (~)0.647s151.00x
🌐 StarterNext.js (Turbopack)1.364s (+1.8%)2.008s (~)0.644s151.00x
💻 LocalNext.js (Turbopack)1.388s (-0.6%)2.012s (~)0.624s151.02x
💻 LocalExpress1.409s (+1.5%)2.006s (~)0.597s151.03x
💻 LocalNitro1.416s (~)2.005s (~)0.589s151.04x
🐘 PostgresNext.js (Turbopack)1.782s (+1.0%)2.016s (~)0.234s151.31x
🌐 MongoDBNext.js (Turbopack)2.127s (-1.3%)3.012s (~)0.886s101.56x
🌐 TursoNext.js (Turbopack)2.235s (+1.1%)3.016s (~)0.781s101.64x
🐘 PostgresExpress2.270s (+1.1%)3.013s (+6.5% 🔺)0.743s101.67x
🐘 PostgresNitro2.494s (+5.9% 🔺)3.012s (~)0.519s101.83x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express2.899s (-11.3% 🟢)3.762s (-8.6% 🟢)0.863s81.00x
▲ VercelNext.js (Turbopack)3.126s (-2.8%)3.818s (-5.4% 🟢)0.692s81.08x
▲ VercelNitro3.531s (+10.3% 🔺)4.461s (+16.6% 🔺)0.930s71.22x

🔍 Observability: Express | Next.js (Turbopack) | Nitro

Promise.all with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Express2.154s (~)3.125s (~)0.971s101.00x
💻 LocalNext.js (Turbopack)2.207s (+6.6% 🔺)3.153s (+11.2% 🔺)0.946s101.02x
💻 LocalNitro2.257s (+3.3%)3.195s (+2.3%)0.938s101.05x
🌐 StarterNext.js (Turbopack)2.481s (+1.8%)3.010s (~)0.529s101.15x
🌐 RedisNext.js (Turbopack)2.481s (~)3.013s (~)0.532s101.15x
🐘 PostgresNext.js (Turbopack)2.487s (-1.7%)3.017s (~)0.530s101.15x
🐘 PostgresNitro2.903s (-2.7%)3.012s (-10.2% 🟢)0.108s101.35x
🐘 PostgresExpress3.029s (+23.6% 🔺)3.583s (+19.0% 🔺)0.554s91.41x
🌐 MongoDBNext.js (Turbopack)4.617s (~)5.181s (~)0.564s62.14x
🌐 TursoNext.js (Turbopack)4.768s (+2.2%)5.184s (~)0.416s62.21x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro3.497s (-2.5%)3.933s (-19.4% 🟢)0.435s81.00x
▲ VercelExpress3.764s (-7.1% 🟢)4.574s (-2.9%)0.811s71.08x
▲ VercelNext.js (Turbopack)3.954s (+12.1% 🔺)4.614s (+4.4%)0.660s71.13x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

Promise.race with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🌐 Starter🥇 Next.js (Turbopack)1.380s (+2.1%)2.008s (~)0.628s151.00x
🌐 RedisNext.js (Turbopack)1.381s (+1.4%)2.010s (~)0.629s151.00x
💻 LocalNext.js (Turbopack)1.405s (+0.8%)2.013s (~)0.608s151.02x
💻 LocalExpress1.409s (+0.9%)2.006s (~)0.597s151.02x
💻 LocalNitro1.426s (+0.9%)2.005s (~)0.579s151.03x
🐘 PostgresNitro1.669s (-12.6% 🟢)2.010s (~)0.341s151.21x
🐘 PostgresNext.js (Turbopack)1.681s (~)2.012s (~)0.331s151.22x
🐘 PostgresExpress1.852s (+4.1%)2.009s (~)0.158s151.34x
🌐 MongoDBNext.js (Turbopack)2.178s (+1.4%)3.011s (~)0.833s101.58x
🌐 TursoNext.js (Turbopack)2.208s (~)3.014s (~)0.806s101.60x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro2.936s (+5.1% 🔺)3.642s (+1.0%)0.706s91.00x
▲ VercelExpress3.054s (+3.3%)3.979s (+3.1%)0.925s81.04x
▲ VercelNext.js (Turbopack)3.084s (+9.5% 🔺)3.870s (+3.8%)0.785s81.05x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

Promise.race with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Express2.208s (+1.2%)3.162s (~)0.954s101.00x
💻 LocalNext.js (Turbopack)2.244s (+3.7%)3.188s (+6.9% 🔺)0.944s101.02x
💻 LocalNitro2.250s (+1.8%)3.196s (+1.3%)0.946s101.02x
🌐 RedisNext.js (Turbopack)2.478s (+0.5%)3.014s (~)0.536s101.12x
🌐 StarterNext.js (Turbopack)2.518s (+1.9%)3.053s (+1.5%)0.535s101.14x
🐘 PostgresNext.js (Turbopack)2.554s (+2.6%)3.024s (~)0.471s101.16x
🐘 PostgresExpress2.556s (-1.4%)3.015s (~)0.460s101.16x
🐘 PostgresNitro2.881s (+8.8% 🔺)3.123s (+3.7%)0.242s101.30x
🌐 MongoDBNext.js (Turbopack)4.669s (-0.9%)5.180s (~)0.511s62.11x
🌐 TursoNext.js (Turbopack)4.803s (+3.7%)5.182s (~)0.379s62.17x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express3.200s (-15.6% 🟢)3.896s (-11.3% 🟢)0.696s81.00x
▲ VercelNext.js (Turbopack)3.438s (-6.0% 🟢)4.099s (-5.3% 🟢)0.661s81.07x
▲ VercelNitro3.752s (+10.3% 🔺)4.560s (+9.1% 🔺)0.808s71.17x

🔍 Observability: Express | Next.js (Turbopack) | Nitro

Stream Benchmarks(includes TTFB metrics)
workflow with stream

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🌐 Starter🥇 Next.js (Turbopack)0.141s (+12.4% 🔺)1.006s (~)0.000s (~)1.013s (~)0.871s101.00x
🌐 RedisNext.js (Turbopack)0.151s (+4.9%)1.005s (~)0.000s (+Infinity% 🔺)1.014s (~)0.864s101.07x
💻 LocalNext.js (Turbopack)0.151s (+8.3% 🔺)1.003s (~)0.017s (-2.8%)1.028s (~)0.877s101.07x
💻 LocalExpress0.175s (+0.6%)0.992s (~)0.018s (+11.4% 🔺)1.024s (~)0.849s101.24x
💻 LocalNitro0.182s (+2.9%)0.992s (~)0.016s (-2.4%)1.022s (~)0.840s101.29x
🌐 MongoDBNext.js (Turbopack)0.482s (-7.5% 🟢)0.964s (+3.8%)0.000s (+Infinity% 🔺)1.013s (~)0.530s103.41x
🌐 TursoNext.js (Turbopack)0.525s (+2.7%)0.930s (-0.7%)0.000s (NaN%)1.014s (~)0.489s103.72x
🐘 PostgresNext.js (Turbopack)0.696s (-41.2% 🟢)0.857s (-44.2% 🟢)0.000s (NaN%)1.016s (-41.2% 🟢)0.319s104.93x
🐘 PostgresExpress2.233s (-6.9% 🟢)2.809s (+6.2% 🔺)0.000s (NaN%)3.015s (~)0.781s1015.80x
🐘 PostgresNitro2.422s (+9.0% 🔺)2.621s (-7.2% 🟢)0.000s (-100.0% 🟢)3.013s (~)0.591s1017.14x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)2.743s (-12.9% 🟢)3.301s (-8.3% 🟢)0.547s (+10.5% 🔺)4.287s (-6.9% 🟢)1.543s101.00x
▲ VercelNitro2.838s (-2.5%)3.153s (-4.8%)0.390s (-10.5% 🟢)4.017s (-4.7%)1.179s101.03x
▲ VercelExpress2.964s (~)3.372s (+4.5%)0.471s (+16.9% 🔺)4.415s (+5.5% 🔺)1.452s101.08x

🔍 Observability: Next.js (Turbopack) | Nitro | Express

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World🥇 Fastest FrameworkWins
💻 LocalNext.js (Turbopack)6/8
🐘 PostgresNext.js (Turbopack)6/8
▲ VercelNitro4/8
Fastest World by Framework

Winner determined by most benchmark wins

Framework🥇 Fastest WorldWins
Express💻 Local8/8
Next.js (Turbopack)🌐 Starter4/8
Nitro💻 Local8/8
Column Definitions
  • Workflow Time: Runtime reported by workflow (completedAt - createdAt) - primary metric
  • TTFB: Time to First Byte - time from workflow start until first stream byte received (stream benchmarks only)
  • Slurp: Time from first byte to complete stream consumption (stream benchmarks only)
  • Wall Time: Total testbench time (trigger workflow + poll for result)
  • Overhead: Testbench overhead (Wall Time - Workflow Time)
  • Samples: Number of benchmark iterations run
  • vs Fastest: How much slower compared to the fastest configuration for this benchmark

Worlds:

  • 💻 Local: In-memory filesystem world (local development)
  • 🐘 Postgres: PostgreSQL database world (local development)
  • ▲ Vercel: Vercel production/preview deployment
  • 🌐 Starter: Community world (local development)
  • 🌐 Turso: Community world (local development)
  • 🌐 MongoDB: Community world (local development)
  • 🌐 Redis: Community world (local development)
  • 🌐 Jazz: Community world (local development)

📋 View full workflow run

Comment threadpackages/cli/src/lib/inspect/setup.ts Outdated
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
vercel[bot]

This comment was marked as resolved.

Comment threadpackages/cli/src/lib/update-check.ts
vercelBotand others added 5 commits December 30, 2025 10:10
…me using `createRequire` with a relative path. When bundled by Vite/SvelteKit for SSR, the relative path becomes invalid because the output file is at a different location than the source file, causing a MODULE_NOT_FOUND error. The fix uses `import.meta.resolve()` which provides correct path resolution even in bundled environments.
This commit fixes the issue reported at packages/world-local/src/init.ts:1-18
## SvelteKit build fails: Cannot find module '../package.json' in bundled SSR code
**What fails:** During SvelteKit SSR build, the `vite build` command fails with error: `Error: Cannot find module '../package.json'` in compiled code at `.svelte-kit/output/server/chunks/step-handler.js:1711:21`
**How to reproduce:**
```bash
cd workbench/sveltekit
pnpm run build
```
During the "rendering chunks" phase, when Vite bundles the SSR output, the compiled code attempts to require `../package.json` which fails because the relative path from the bundled output file location is invalid.
**Result:**
```
Error: Cannot find module '../package.json'
Require stack:
- /vercel/path0/workbench/sveltekit/.svelte-kit/output/server/chunks/step-handler.js
```
**Root cause:** The `packages/world-local/src/init.ts` file uses `createRequire(import.meta.url)` with a relative path `../package.json` to load the package.json file. When Rollup/Vite bundles this code for SSR, the relative path becomes invalid because the output file is at a different location than the source file.
**Solution:** Use `import.meta.resolve()` which provides proper module path resolution even in bundled environments. Falls back to `createRequire()` for compatibility with test environments where `import.meta.resolve()` may not be available.
Co-authored-by: Vercel <vercel[bot]@users.noreply.github.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Comment threadpackages/cli/src/lib/update-check.ts Outdated
VaguelySeriousand others added 4 commits January 2, 2026 14:40
Co-authored-by: vercel[bot] <35613825+vercel[bot]@users.noreply.github.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@VaguelySerious@pranaygp