Skip to content

T-M7QX-migrate-pumice-frontend-to-bun

Status: closed/done · Impact: high · Complexity: large

Migrate pumice’s frontend (apps/pumice/src-nuxt plus the apps/pumice/packages/* libraries) from pnpm to Bun, retiring the three pnpm lockfiles, so pumice satisfies D-0012-monorepo-tooling’s Bun-everywhere standard and its “no stray lockfiles” success criterion. This is the highest-risk Phase-1 task and should be de-risked with a spike before full commitment.

After T-K3PN, pumice is vendored under apps/pumice and its frontend still installs with pnpm.

LocationRole today
apps/pumice/pnpm-lock.yamlRoot pnpm lockfile
apps/pumice/src-nuxt/pnpm-lock.yamlNuxt app lockfile
apps/pumice/packages/nuxt_admin_layer/pnpm-lock.yamlLayer lockfile
apps/pumice/package.json (pnpm field)onlyBuiltDependencies (native builds)
apps/dashboard/bun.lockThe per-app Bun lockfile shape to match

Convert every frontend install to Bun and produce a single apps/pumice/bun.lock (per-app, matching apps/dashboard), verifying the native-dependency and Storybook paths that Bun handles differently from pnpm.

  1. Spike first (highest-risk pieces). Before committing, prove Bun can run Storybook and the browser-mode Vitest (Playwright) suite, and can build the native deps (better-sqlite3, @parcel/watcher, esbuild, unrs-resolver). These are the parts a paper migration cannot de-risk.
  2. Convert installs. Replace pnpm invocations in pumice’s package.json scripts, justfile, and tauri.conf.json (beforeDevCommand/ beforeBuildCommand) with Bun equivalents; translate onlyBuiltDependencies to Bun’s trustedDependencies.
  3. Reconcile nested packages. The packages/admin-types and nuxt_admin_layer file: deps and the Nuxt layer resolution must resolve under Bun (workspace/file: protocol); verify @ontogen/admin-types resolves.
  4. Regenerate the lockfile. Delete the three pnpm-lock.yaml files and bun install to produce apps/pumice/bun.lock.
  5. Verify end-to-end. bun run the Nuxt build, typecheck, unit tests, Storybook build, and confirm the Tauri build still consumes the generated frontend dist.
LocationKindChange
apps/pumice/package.jsoneditpnpm scripts → Bun; onlyBuiltDependenciestrustedDependencies
apps/pumice/src-nuxt/package.jsoneditpackageManager/scripts → Bun
apps/pumice/**/pnpm-lock.yamldeleteRetire all three pnpm lockfiles
apps/pumice/bun.locknewSingle per-app Bun lockfile
apps/pumice/tauri.conf.jsoneditbeforeDevCommand/beforeBuildCommand → Bun
apps/pumice/justfileeditpnpm recipes → Bun
apps/pumice/moon.ymleditTask commands → bun/bunx
  • AC-1: No pnpm-lock.yaml remains under apps/pumice; a single apps/pumice/bun.lock exists.
  • AC-2: bun install succeeds and native deps build (better-sqlite3 et al. load at runtime).
  • AC-3: Nuxt build, typecheck, unit tests, and Storybook build all pass under Bun.
  • AC-4: The Tauri build consumes the Bun-produced frontend dist unchanged.
  • AC-5: moon run pumice:build / pumice:test drive the Bun commands.
  • Rust/codegen changesT-P4LZ, T-R9WT.
  • CI wiringT-T2HB (this task proves local Bun builds; CI folds them in next).
  • T-K3PN (hard): the vendored tree is what this migrates.

T-K3PN


← Back to Tasks