You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
While investigating #11992, I confirmed that pnpm v11 writes a handful of settings into node_modules/.pnpm-workspace-state-v1.json that pacquet's pnpm-workspace.yaml reader does not yet recognize. They also aren't consumed anywhere in pacquet's install pipeline, so pacquet's resolution and linking ignore them outright today.
Capturing them here so they can each be tracked, ported, and removed from the ignored-in-comparison set in optimistic_repeat_install's settings-drift check.
Settings to port
dedupeDirectDeps (default true) — skip the per-importer node_modules/<alias> symlink when the workspace root resolves the same alias to the same target (direct-vs-direct, direct-vs-public-hoist, and direct-vs-shamefully-hoist). Landed in feat(pacquet/package-manager): port dedupeDirectDeps setting #12024 (also added the missing fresh-install hoist phase so the public-hoist parity holds on both --frozen-lockfile and fresh pacquet install).
dedupeInjectedDeps (default true) — dedupes injected workspace dependencies in the virtual store. Landed in feat(pacquet): port dedupeInjectedDeps #12023 (Config.dedupe_injected_deps yaml + env overlay, dependenciesMeta[*].injected plumbed end-to-end, multi-importer resolve_workspace orchestrator with cross-importer peersCache/purePkgs sharing, dedupe pass inside resolve_peers_workspace matching pnpm's resolvePeers integration, ImporterDepVersion::File lockfile arm + linker wiring for the dedupe-off path, and workspace-state round-trip). Remaining Windows materialise gap for file:<workspace> snapshots tracked in pacquet: materialise file:<workspace> snapshots in create_virtual_store #12038.
packageExtensions — extends already-published package manifests at install time. Landed in feat(package-manager): port packageExtensions setting #12027 (yaml plumbing + Config field + env var, PackageExtender hook port of createPackageExtender applied during resolve, lockfile packageExtensionsChecksum write + frozen-install drift gate, and workspace-state round-trip).
Each setting is a separate piece of work — yaml plumbing, Config field, optional CLI flag mirror, and an actual consumer in the resolver / linker / store path. Once a setting is implemented end-to-end and lands in current_settings, the optimistic-repeat-install check naturally starts gating on it without any further wiring.
Settings explicitly NOT on this list
Pacquet already supports these (just not surfaced in current_settings for the optimistic check yet — a smaller follow-up tracked separately):
And these have a different shape on the pacquet side that already covers the use case:
catalogs — read into WorkspaceManifest.catalogs; pnpm itself always ignores it in the checkDepsStatus comparison (ignoredSettings.add('catalogs') at deps/status/src/checkDepsStatus.ts:137).
workspacePackagePatterns — pnpm derives this from pnpm-workspace.yaml's packages: field, which pacquet already reads into WorkspaceManifest.packages.
While investigating #11992, I confirmed that pnpm v11 writes a handful of settings into
node_modules/.pnpm-workspace-state-v1.jsonthat pacquet'spnpm-workspace.yamlreader does not yet recognize. They also aren't consumed anywhere in pacquet's install pipeline, so pacquet's resolution and linking ignore them outright today.Capturing them here so they can each be tracked, ported, and removed from the ignored-in-comparison set in
optimistic_repeat_install's settings-drift check.Settings to port
dedupeDirectDeps(defaulttrue) — skip the per-importernode_modules/<alias>symlink when the workspace root resolves the same alias to the same target (direct-vs-direct, direct-vs-public-hoist, and direct-vs-shamefully-hoist). Landed in feat(pacquet/package-manager): port dedupeDirectDeps setting #12024 (also added the missing fresh-install hoist phase so the public-hoist parity holds on both--frozen-lockfileand freshpacquet install).dedupeInjectedDeps(defaulttrue) — dedupes injected workspace dependencies in the virtual store. Landed in feat(pacquet): port dedupeInjectedDeps #12023 (Config.dedupe_injected_depsyaml + env overlay,dependenciesMeta[*].injectedplumbed end-to-end, multi-importerresolve_workspaceorchestrator with cross-importerpeersCache/purePkgssharing, dedupe pass insideresolve_peers_workspacematching pnpm'sresolvePeersintegration,ImporterDepVersion::Filelockfile arm + linker wiring for the dedupe-off path, and workspace-state round-trip). Remaining Windows materialise gap forfile:<workspace>snapshots tracked in pacquet: materialise file:<workspace> snapshots in create_virtual_store #12038.dedupePeers(defaultfalse) — dedupes peers across the dependency graph. Landed in feat(pacquet/deps-resolver): port dedupePeers setting #12022.excludeLinksFromLockfile(defaultfalse) — keepslink:andfile:protocol entries out ofpnpm-lock.yaml. Landed in feat(pacquet): port excludeLinksFromLockfile #12025 (barelink:only —file:falls under the separate copy-shaped path).injectWorkspacePackages(defaultfalse) — materializes workspace dependencies instead of symlinking them. Landed in feat(pacquet): port injectWorkspacePackages setting #12021 (global flag, per-depdependenciesMeta[*].injectedoverride, lockfile round-trip, and freshness gate).packageExtensions— extends already-published package manifests at install time. Landed in feat(package-manager): port packageExtensions setting #12027 (yaml plumbing +Configfield + env var,PackageExtenderhook port ofcreatePackageExtenderapplied during resolve, lockfilepackageExtensionsChecksumwrite + frozen-install drift gate, and workspace-state round-trip).peersSuffixMaxLength(default1000) — cap on the peer-dep hash suffix in virtual-store dir names; longer suffixes get truncated and hashed. Landed in feat(pacquet/config): port peersSuffixMaxLength setting #12026.preferWorkspacePackages(defaultfalse) — prefer a matching workspace package over the registry even when the dep range would also satisfy a registry version. Landed in feat(pacquet/config): port preferWorkspacePackages setting #12032.Scope and process
Each setting is a separate piece of work — yaml plumbing,
Configfield, optional CLI flag mirror, and an actual consumer in the resolver / linker / store path. Once a setting is implemented end-to-end and lands incurrent_settings, the optimistic-repeat-install check naturally starts gating on it without any further wiring.Settings explicitly NOT on this list
Pacquet already supports these (just not surfaced in
current_settingsfor the optimistic check yet — a smaller follow-up tracked separately):minimumReleaseAge,minimumReleaseAgeExclude,minimumReleaseAgeIgnoreMissingTime,minimumReleaseAgeStricttrustPolicy,trustPolicyExclude,trustPolicyIgnoreAfterAnd these have a different shape on the pacquet side that already covers the use case:
catalogs— read intoWorkspaceManifest.catalogs; pnpm itself always ignores it in thecheckDepsStatuscomparison (ignoredSettings.add('catalogs')atdeps/status/src/checkDepsStatus.ts:137).workspacePackagePatterns— pnpm derives this frompnpm-workspace.yaml'spackages:field, which pacquet already reads intoWorkspaceManifest.packages.Found via #11992.
Written by an agent (Claude Code, claude-opus-4-7).