* test(fetch): verify pnpm fetch populates global virtual store links/
pnpm fetch flows through headlessInstall → lockfileToDepGraph →
iteratePkgsForVirtualStore, which respects enableGlobalVirtualStore.
When enabled, packages are written to the store's links/ directory
instead of only the CAS. This behavior is relied upon by tools that
pre-build stores (Docker multistage builds, Nix, CI caching) but was
not covered by any test.
Also adds enableGlobalVirtualStore to FetchCommandOptions type to
match the runtime behavior where the option flows through via the
opts spread.
* test(fetch): use lockfileOnly instead of full install in GVS test
The test only needs a lockfile for the fetch step, so a full install
followed by rimraf of node_modules is unnecessary.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Zoltan Kochan <z@kochan.io>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
**TLDR:** Global packages in pnpm v10 are annoying and slow because they all are installed to a single global package. Instead, we will now use a system that is similar to the one used by "pnpm dlx" (aka "pnpx").
Each globally installed package (or group of packages installed together) now gets its own isolated installation directory with its own `package.json`, `node_modules`, and lockfile. This prevents global packages from interfering with each other through peer dependency conflicts or version resolution shifts.
## Changes
- Add `@pnpm/global-packages` shared utilities package for scanning, hashing, and managing isolated global installs
- `pnpm add -g` creates isolated installs in `{pnpmHomeDir}/global/v11/{hash}/`
- `pnpm remove -g` removes the entire installation group containing the package
- `pnpm update -g` re-installs into new isolated directories and swaps symlinks
- `pnpm list -g` scans isolated directories to show installed global packages
- `pnpm outdated -g` checks each isolated installation for outdated dependencies
- `pnpm store prune` cleans up orphaned global installation directories
## Breaking changes
- `pnpm install -g` (no args) is no longer supported — use `pnpm add -g <pkg>`
- `pnpm link <pkg-name>` no longer resolves packages from the global store — only relative or absolute paths are accepted
- `pnpm link --global` is removed — use `pnpm add -g .` to register a local package's bins globally
* test: fix flaky tests & add retries for failed tests during CI testing
* fix: import jest in setupFilesAfterEnv & reduce retries to 2
* test: remove global retries
This fixes an issue where pnpm fetch would fail in Docker builds when
local directory dependencies (file: protocol) were not available.
The fix adds an ignoreLocalPackages option that is passed from the fetch
command to skip local dependencies during graph building, since pnpm
fetch only downloads packages from the registry and doesn't need local
packages that won't be available in Docker builds.
close#10460
* chore: create empty new `@pnpm/yaml.document-sync` package
* feat: implement @pnpm/yaml.document-sync
* feat: preserve comments when updating `pnpm-workspace.yaml`
* fix: add missing rootProjectManifestDir field to fix test
This was causing a test to fail due to the rootProjectManifestDir being
an empty string.
The main branch doesn't have this problem because `write-yaml-file`
internally does a `path.dirname(...)` call that ends up resolving the
empty string to `.`.
● logger warns about peer dependencies when linking
ENOENT: no such file or directory, mkdir ''
25 | singleQuote: true, // Prefer single quotes over double quotes
26 | })
> 27 | await fs.promises.mkdir(dir, { recursive: true })
| ^
28 | await writeFileAtomic(path.join(dir, fileName), manifestStr)
29 | }
30 |
at writeManifestFile (../../workspace/manifest-writer/src/index.ts:27:3)
at updateWorkspaceManifest (../../workspace/manifest-writer/src/index.ts:83:3)
at writeSettings (../../config/config-writer/src/index.ts:38:3)
at addLinkToManifest (src/link.ts:182:3)
at src/link.ts:161:7
at async Promise.all (index 0)
at Module.handler (src/link.ts:159:3)
at Object.<anonymous> (test/link.ts:300:3)%
* Update workspace/manifest-writer/src/index.ts
* fix(git-fetcher): ensure the specified commit is used after checkout
* fix(git-resolver): always resolve to a full commit
* chore: add changeset heavy-dragons-start
* test: fix related test case
* test: fix some other test that gets stuck
* Update heavy-dragons-start.md with PR reference
Add reference to pull request #10310 for clarity.
This is an addition to https://github.com/pnpm/pnpm/pull/8190. The global virtual store isn't a good choice for CI. So, we disable it even if the setting sets `enableGlobalVirtualStore` to `true`.
* fix: reference root manifest directory instead of the dependent dir
This fixes https://github.com/pnpm/pnpm/issues/9066.
* refactor: link test
* docs: add changeset
---------
Co-authored-by: Zoltan Kochan <z@kochan.io>