Files
agent-skills/skills/pnpm/references/best-practices-migration.md
Jason Woltje f5792c40be feat: Complete fleet — 94 skills across 10+ domains
Pulled ALL skills from 15 source repositories:
- anthropics/skills: 16 (docs, design, MCP, testing)
- obra/superpowers: 14 (TDD, debugging, agents, planning)
- coreyhaines31/marketingskills: 25 (marketing, CRO, SEO, growth)
- better-auth/skills: 5 (auth patterns)
- vercel-labs/agent-skills: 5 (React, design, Vercel)
- antfu/skills: 16 (Vue, Vite, Vitest, pnpm, Turborepo)
- Plus 13 individual skills from various repos

Mosaic Stack is not limited to coding — the Orchestrator and
subagents serve coding, business, design, marketing, writing,
logistics, analysis, and more.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 16:27:42 -06:00

5.0 KiB

name, description
name description
migration-to-pnpm Migrating from npm or Yarn to pnpm with minimal friction

Migration to pnpm

Guide for migrating existing projects from npm or Yarn to pnpm.

Quick Migration

From npm

# Remove npm lockfile and node_modules
rm -rf node_modules package-lock.json

# Install with pnpm
pnpm install

From Yarn

# Remove yarn lockfile and node_modules
rm -rf node_modules yarn.lock

# Install with pnpm
pnpm install

Import Existing Lockfile

pnpm can import existing lockfiles:

# Import from npm or yarn lockfile
pnpm import

# This creates pnpm-lock.yaml from:
# - package-lock.json (npm)
# - yarn.lock (yarn)
# - npm-shrinkwrap.json (npm)

Handling Common Issues

Phantom Dependencies

pnpm is strict about dependencies. If code imports a package not in package.json, it will fail.

Problem:

// Works with npm (hoisted), fails with pnpm
import lodash from 'lodash' // Not in dependencies, installed by another package

Solution: Add missing dependencies explicitly:

pnpm add lodash

Missing Peer Dependencies

pnpm reports peer dependency issues by default.

Option 1: Let pnpm auto-install:

# .npmrc (default in pnpm v8+)
auto-install-peers=true

Option 2: Install manually:

pnpm add react react-dom

Option 3: Suppress warnings if acceptable:

{
  "pnpm": {
    "peerDependencyRules": {
      "ignoreMissing": ["react"]
    }
  }
}

Some tools don't work with symlinks. Use hoisted mode:

# .npmrc
node-linker=hoisted

Or hoist specific packages:

public-hoist-pattern[]=*eslint*
public-hoist-pattern[]=*babel*

Native Module Rebuilds

If native modules fail, try:

# Rebuild all native modules
pnpm rebuild

# Or reinstall
rm -rf node_modules
pnpm install

Monorepo Migration

From npm Workspaces

  1. Create pnpm-workspace.yaml:

    packages:
      - 'packages/*'
    
  2. Update internal dependencies to use workspace protocol:

    {
      "dependencies": {
        "@myorg/utils": "workspace:^"
      }
    }
    
  3. Install:

    rm -rf node_modules packages/*/node_modules package-lock.json
    pnpm install
    

From Yarn Workspaces

  1. Remove Yarn-specific files:

    rm yarn.lock .yarnrc.yml
    rm -rf .yarn
    
  2. Create pnpm-workspace.yaml matching workspaces in package.json:

    packages:
      - 'packages/*'
    
  3. Update package.json - remove Yarn workspace config if not needed:

    {
      // Remove "workspaces" field (optional, pnpm uses pnpm-workspace.yaml)
    }
    
  4. Convert workspace references:

    // From Yarn
    "@myorg/utils": "*"
    
    // To pnpm
    "@myorg/utils": "workspace:*"
    

From Lerna

pnpm can replace Lerna for most use cases:

# Lerna: run script in all packages
lerna run build

# pnpm equivalent
pnpm -r run build

# Lerna: run in specific package
lerna run build --scope=@myorg/app

# pnpm equivalent  
pnpm --filter @myorg/app run build

# Lerna: publish
lerna publish

# pnpm: use changesets instead
pnpm add -Dw @changesets/cli
pnpm changeset
pnpm changeset version
pnpm publish -r

Configuration Migration

.npmrc Settings

Most npm/Yarn settings work in pnpm's .npmrc:

# Registry settings (same as npm)
registry=https://registry.npmjs.org/
@myorg:registry=https://npm.myorg.com/

# Auth tokens (same as npm)
//registry.npmjs.org/:_authToken=${NPM_TOKEN}

# pnpm-specific additions
auto-install-peers=true
strict-peer-dependencies=false

Scripts Migration

Most scripts work unchanged. Update pnpm-specific patterns:

{
  "scripts": {
    // npm: recursive scripts
    "build:all": "npm run build --workspaces",
    // pnpm: use -r flag
    "build:all": "pnpm -r run build",
    
    // npm: run in specific workspace  
    "dev:app": "npm run dev -w packages/app",
    // pnpm: use --filter
    "dev:app": "pnpm --filter @myorg/app run dev"
  }
}

CI/CD Migration

Update CI configuration:

# Before (npm)
- run: npm ci

# After (pnpm)
- uses: pnpm/action-setup@v4
- run: pnpm install --frozen-lockfile

Add to package.json for Corepack:

{
  "packageManager": "pnpm@9.0.0"
}

Gradual Migration

For large projects, migrate gradually:

  1. Start with CI: Use pnpm in CI, keep npm/yarn locally
  2. Add pnpm-lock.yaml: Run pnpm import to create lockfile
  3. Test thoroughly: Ensure builds work with pnpm
  4. Update documentation: Update README, CONTRIBUTING
  5. Remove old files: Delete old lockfiles after team adoption

Rollback Plan

If migration causes issues:

# Remove pnpm files
rm -rf node_modules pnpm-lock.yaml pnpm-workspace.yaml

# Restore npm
npm install

# Or restore Yarn
yarn install

Keep old lockfile in git history for easy rollback.