期間: 2026-09-17 〜 2026-09-24 · PR 321 件(新機能 30 / 変更・修正 なし / その他 291)
このリポジトリの規模について
この期間に merge された PR は 321 件あり、詳しく確認したのは上限(
maxPrs: 30)にあたる 30 件のみ。詳しく扱った 30 件はすべてhint: feature(新機能)に分類されたもので、残り 291 件はタイトルだけの簡易情報(brief: true)のため、下の「その他」にまとめて記載する。
新機能
Python 環境間で wheel ファイルを共有できるように(#15006)
何ができるようになったか
Python 環境が、ワークスペースの reflink ライブラリを使って変更されていない wheel ファイルをそのまま取り込むようになった。
- 使い方:
python.linkModeにcopy/hardlink/reflinkを指定(既定はreflink。使えない環境では独立コピーにフォールバック)。分離ビルド環境にも同じ設定が適用される- メリット:
reflinkモードでは複数の環境が同じ wheel の実データを共有でき、ディスク使用量を抑えられる。生成されたメタデータやエントリーポイント、shebang/権限変更が必要な wheel スクリプトは環境ごとに専有される
📦 v12.6.0 · トピック: Python サポート
wheel が無い Python パッケージをソース配布物(sdist)からインストール可能に(#15009)
何ができるようになったか
対象環境が使える wheel を1つも持たないリリースが、インデックスが並べて配布するソース配布物(sdist)から導入できるようになった。
- 仕組み: ソース候補は常に wheel より優先度が低く、
.tar.gzと.zipを読める。アーカイブは pnpm の共有アーティファクトパイプラインを通り、SHA-256 検証・リトライ・ストア重複排除・オフライン再生を受ける- セキュリティ: アーカイブは HTTP(S) 経由のものだけを受け付け、lockfile 境界とビルド前の両方でチェックする(
file:URL や信頼できないpylock.tomlからのビルド実行を防ぐため)
📦 v12.6.0 · トピック: Python サポート
タスクに「並行実行グループ」とマシン全体の同時実行数上限を追加(#15010)
何ができるようになったか
pnpm-workspace.yamlのタスクにconcurrencyGroupを指定し、concurrencyGroupsでグループごとの同時実行数上限を決められるようになった。
- 使い方:
tasks: test:rust: concurrencyGroup: cargo concurrencyGroups: cargo: 2- 嬉しい場面: 複数の worktree で同時に重い Rust ビルドやテストを走らせてメモリ不足になる状況を防げる。上限を超えたタスクは待機し、誰が枠を使っているか表示される
- 仕組み: 枠は
<stateDir>/run-slots/<group>/下のファイルへのアドバイザリロックとして実装。プロセスが終了すれば自動的に解放される。pnpm run・スクリプトショートカット・pnpm pipelineのタスクが対象。pnpm execはタスク名を持たないため対象外
📦 v12.6.0 · トピック: タスク実行・並行処理
ワークスペースの複数プロジェクトで1つの Python 環境を共有できるように(#15019)
何ができるようになったか
[tool.uv.workspace]を宣言するワークスペースルートで[tool.pnpm.python] shared-environment = trueを設定すると、pnpm installがメンバー全員を1つの依存グラフとして解決し、ルートに1つのpylock.tomlと1つの.venvを作るようになった。
- 既定動作: 何も設定しなければ各プロジェクトは今まで通り独立した環境を持つ
- extras/groups: 引き続きメンバーごとに選択でき、環境はその和集合を持つ
--filter: どのメンバーを選んでも共有環境全体をインストールする(一部だけの環境では他のメンバーが動かせなくなるため)- lockfile: どのメンバーに対応するかを
tool.pnpm.membersに相対パスで記録し、メンバーの追加・削除で無効化される
📦 v12.6.0 · トピック: Python サポート
overrides にエコシステムごとのセクションを追加(npm/pypi)(#15024)
何ができるようになったか
ワークスペースの
overridesが、エコシステムごとのセクションに対応した。
- 使い方:
overrides: npm: lodash: 4.17.21 pypi: - "requests>=2,<3"- 互換性: 既存のフラットな
overridesマップは npm 用のままで変わらない。PyPI のエントリは PEP 508 の要求文字列で、バージョン・extras・マーカーを含められる
📦 v12.6.0 · トピック: マルチエコシステム設定
Python 環境の実体をプロジェクトではなくストアに置くように(#15026)
何ができるようになったか
Python 環境の世代(generation)が、プロジェクトの
.pnpm/python-envs/から<store>/python-envs/<project>/に移った。プロジェクト側に残るのは.venv(現在使っている世代への絶対パスリンク)だけになった。
- 嬉しい場面: Python プロジェクトを多数持つリポジトリで、
.pnpm配下に世代ディレクトリが増え続けるのを防げる- 互換性: 公開はこれまで通りプロジェクトディレクトリ内でのアトミックなシンボリックリンク張り替えで、ロールバックも従来通り動く。12.4 で作られた
.venvは次回インストールでストアへ再リンクされる
📦 v12.6.0 · トピック: Python サポート
supportedArchitectures にプラットフォーム単位の指定を追加、python.platforms を統合(#15035)
何ができるようになったか
supportedArchitecturesが、os/cpu/libcの直積では表せない「実際に使うプラットフォームの組」を、プラットフォーム名の列挙として書けるようになった。
- 使い方:
supportedArchitectures: - linux-x64-manylinux_2_28 - darwin-arm64 - win32-x64- 表記: pnpm 独自の
<os>-<cpu>[-<libc>]と、uv などが使う Rust ターゲットトリプルの両方を読め、両者は同じ値に正規化される。Linux の C ライブラリ欄は Python wheel の ABI ベースラインも兼ねる- 統合:
python.platformsは廃止され、この1つのフィールドに統合された。従来のos/cpu/libcによるマッピングも引き続き有効
📦 v12.6.0 · トピック: マルチエコシステム設定
Python インタプリタのインストール可否を runtimeOnFail に統合(#15036)
何ができるようになったか
Node.js/Deno/Bun のランタイムで使われている
runtimeOnFail設定が Python にも適用され、専用のpython.downloadsはこれに統合された。
- モード:
unset/download(従来のauto相当、1つインストール)、error(従来のnever相当、エラー報告)、warn(条件に合わないインタプリタで実行し警告。新規)、ignore(同上、無警告。新規)- 変わらない点:
python.platforms/python.pythonVersionsがrequires-pythonの外を指定している場合は、どのモードでも引き続きエラー(設定の誤りとして扱われる)
📦 v12.6.0 · トピック: Python サポート
pnpm がダウンロードするツール(Node/Bun/Deno/Python)のミラーを tools で一括設定(#15043)
何ができるようになったか
Node.js・Bun・Deno のランタイムと Python インタプリタのダウンロード元が、
node-mirror:<channel>やpython.downloadUrlのようにバラバラだった設定から、共通のtools設定にまとまった。
- 使い方:
tools: node: mirror: https://mirror.example.com/node/download channels: nightly: https://nightly.example.com/ bun: mirror: https://mirror.example.com/bun python: mirror: https://mirror.example.com/python-build-standalone/releases- 嬉しい場面: プロキシの内側にいるユーザーが、これまで設定できなかった Bun・Deno の取得元もまとめてミラーへ向けられる。
mirrorは基準ホストのみを差し替え、その下のレイアウトはそのまま使う。channelsは特定チャンネル(例: nightly)だけ別の場所から取りたいときに使う
📦 v12.6.0 · トピック: マルチエコシステム設定
registries のエントリにエコシステム(npm/pypi/cargo)を指定できるように(#15054)
何ができるようになったか
registry/registries、python.indexUrl/extraIndexUrls、cargo.indexUrlという別々だった3つの設定が、registriesエントリのecosystemフィールドに統合された。
- 使い方:
registries: https://internal.example/simple/: ecosystem: pypi https://pypi.org/simple/: ecosystem: pypi https://index.crates.io: ecosystem: cargo- 互換性:
ecosystemを書かないエントリは npm 用のまま- 解決順: 複数インデックスを持つエコシステムは宣言順に検索し、最初に見つかったものを使う(uv の
default = trueのような特別扱いはせず、順序だけで決める)。資格情報はregistriesに書けず.npmrcから読む
📦 v12.6.0 · トピック: マルチエコシステム設定
pnpm add が Package URL(purl)に対応(#14949)
何ができるようになったか
pnpm addがパッケージ名の代わりに Package URL を受け付け、purl の type が示すエコシステムへルーティングするようになった。
- 使い方:
例 結果 pnpm add pkg:npm/express@4.18.2package.jsonに"express": "4.18.2"pnpm add pkg:cargo/serde@1.0.188Cargo.tomlにserde = "1.0.188"pnpm add pkg:pypi/requests@2.31.0pyproject.tomlに"requests==2.31.0"- 仕組み: 各 purl はそのエコシステム自身のセレクタ構文に書き換えられ、既存のフラグ・既定値・エラーメッセージをそのまま引き継ぐ。対象は
pnpm add(pnpm install <pkg>経由を含む)のみ- 注意:
pkgは予約済みの指定子接頭辞になり、同名のレジストリは登録できなくなった
📦 v12.6.0 · トピック: マルチエコシステム設定
プロジェクトの bin シムを移動可能に(相対パス化)(#15041)
何ができるようになったか
macOS/Linux で、プロジェクトの bin シムが自分の位置から
NODE_PATHのルート内エントリを解決するようになった。
- 効果: ターゲットマーカーやルート内の
.bin/nodeリンクも相対パスになり、プロジェクトを移動・コピーしても元のディレクトリを指したままにならない- 移行: 既存インストールの relink 時に、絶対パスの
.bin/nodeリンクも相対リンクへ変換される(既に相対的なリンクはそのまま)- 範囲: pnpm v12 の新機能。Windows のレンダリングやルート外パスの移動対応は含まない
📦 v12.6.0 · トピック: プロジェクト移動
pnpm cache prune を追加、cache list-registries の表示を修正(#15048)
何ができるようになったか
レジストリキャッシュまわりの2つの改善が入った。
cache list-registriesの修正(v11/v12 両方): これまで生のディレクトリ名を表示していたのを、cache viewと同じくデコード済みのレジストリ URL を表示するように修正pnpm cache prune(新規、v12 のみ): 12.4.0 でメタデータディレクトリ名の付け方が変わったことで残っていた、現在のバージョンでは読めない古いキャッシュディレクトリを削除する
📦 v12.6.0 · トピック: CLI コマンド
カタログのエントリで file:/link: プロトコルを使えるように(#15108)
何ができるようになったか
これまで
ERR_PNPM_CATALOG_ENTRY_INVALID_SPECで拒否されていた、file:/link:プロトコルを使うカタログエントリに対応した。
- 使い方:
# pnpm-workspace.yaml catalog: test-pkg: file:./tarballs/test-pkg-1.0.0.tgz local-lib: link:./libs/local-lib- 仕組み: 相対パスは
pnpm-workspace.yamlがあるディレクトリを基準に解決されるので、ワークスペース内のどのプロジェクトから参照しても同じ tarball / ディレクトリを指す- 範囲: v12 のみの機能。ベアパス(例:
./tarballs/foo.tgz)は元々許可されていて動作は変わらない
📦 v12.6.0 · トピック: 依存関係解決
--no-progress オプションと progress 設定を追加(#14065)
何ができるようになったか
進捗表示だけを抑制する専用の設定が無く、警告やライフサイクル出力・コマンドサマリーまで消す設定しかなかった問題を解消。npm/Yarn/Bun と同様の進捗専用の制御を追加した(v12 のみ)。
- 使い方:
--progress/--no-progress、--config.progress、PNPM_CONFIG_PROGRESS、pnpm-workspace.yamlのprogressから指定(コマンドラインが最優先)- 効果: オフにすると
Progress:行と大きな tarball のDownloading行が消える。警告・ライフサイクル出力・依存関係サマリー・アップデートチェックには影響しない。ndjsonレポーターは引き続き全イベントを出す
📦 v12.6.0 · トピック: CLI コマンド
移動した node_modules を再インストールなしで再利用(#15112)
何ができるようになったか
#15041 で bin シムが移動後も動くようになったのに続き、
pnpm run/pnpm execが移動をワークスペース構造の変更とみなしてインストールを開始してしまう問題を解消した。
- 仕組み: 既存のインストールを検証し新しい場所を記録することで、壊れていない依存関係をリンクや shim を書き換えずに再利用する
- 効果: 移動後の初回コマンド実行で不要な再インストールが走らなくなり、変更されるファイル・シンボリックリンク数も大幅に減る(計測例では数百件→1件)
- 範囲: Unix の isolated / hoisted レイアウトに対応。グローバル仮想ストアを使うプロジェクトは既存のパスのまま
📦 v12.6.0 · トピック: プロジェクト移動
package.yaml への書き込みに対応(#15153)
何ができるようになったか
v12 は
package.yamlを読めるが、共有マニフェストライターは JSON しか出力できず、一部の編集コマンドはpackage.jsonが必須だった。これに YAML への書き込みが追加され、pkg・version・set-script・linkもマニフェスト検出につながった。
- 効果: 既存の YAML コメントとキー順は保持され、新しいキーは末尾に追加される。バルク編集はバッチで適用される
- 安全性: 不正なマニフェストルートや衝突する YAML キーは書き込み前に拒否される。
~・0x2aのような代替スカラーキー表記も保持される
📦 v12.6.0 · トピック: CLI コマンド
pnpm add --tilde を --save-prefix=~ の別名として追加(#15200)
何ができるようになったか
Yarn Classic 由来の
--tildeを pacquet のaddコマンドに追加した。
- 背景: Yarn Classic からの移行者が
--save-prefix=~の存在に気づけず、pnpm には相当機能が無いと誤解して離脱するのを防ぐ狙い- 優先順位:
--save-exactが--tildeより優先される。設定のsaveExact/savePrefixも--save-prefixと同様に上書きする。短縮オプション-Tは予約されていない
📦 v12.6.0 · トピック: CLI コマンド
pnpm update --peer で peerDependencies も更新可能に(#11031)
何ができるようになったか
これまで
pnpm upはpeerDependenciesに載っているパッケージを黙ってスキップしていたが、--peerフラグで更新できるようになった。
- 使い方:
pnpm up --peerで既存の範囲内更新、pnpm up --latest --peerで最新版へ、pnpm up --peer reactのように対象を絞ることもできる- 互換性: オプトインのため既定の挙動は変わらない。ピアの範囲は
getPeerSpecifier()で適切な形式(例:^2.0.0)に整形される
📦 v12.6.0 · トピック: 依存関係解決
並行実行グループの待機タスクを到着順に処理(#15208)
何ができるようになったか
空き枠を
try_lockの指数バックオフによるポーリングで取り合っていたため、後から来たタスクが短い間隔のポーリングで先に枠を取ってしまうことがあった問題を修正。
- 仕組み: 各待機タスクが
<stateDir>/run-slots/<group>/waiters/にチケット(ロック)を取り、生きている待機者のうち優先度が最も高く最も古いものが空いた枠を取る。プロセスが終了していれば(ロックが無ければ)飛ばされる- 新しい可視化:
pnpm tasks statusで各グループの実行中/待機中タスクと待ち順・待ち時間を確認できる(v12 のみ、priorityは新設のタスク設定)
📦 v12.6.0 · トピック: タスク実行・並行処理
依存関係の自動重複排除(autoDedupe)を追加(#15218)
何ができるようになったか
オプトインの
autoDedupeを追加。pnpm install/pnpm addが、ロックファイル形式や上書き記録(overrides)を変えずに、解決中に見つかった互換なバージョンを1つにまとめるようになった。
- 使い方:
pnpm-workspace.yamlで有効化するか--auto-dedupe。--no-auto-dedupeで無効化- 範囲: frozen install はロックファイルをそのまま保つ。非 frozen インストールを
pnprServerに委譲する場合は現時点でautoDedupeに対応していない(重複排除はローカルリゾルバでのみ実行)
📦 v12.6.0 · トピック: 依存関係解決
ワークスペース検出 API の同期版をエクスポート(#15222)
何ができるようになったか
公開されているワークスペースパッケージから、同期的に実行するツールやプラグイン向けの API がエクスポートされるようになった。
- 追加された関数:
findWorkspaceDirSync、findPackagesSync、findWorkspaceProjectsSync、findWorkspaceProjectsNoCheckSync、readWorkspaceManifestSync、readExactProjectManifestSync
📦 v12.6.0 · トピック: CLI コマンド
pnpm add --save-types で型定義パッケージも一緒に保存(#15251)
何ができるようになったか
宣言ファイルを同梱していないレジストリパッケージに対応する
@types/*を自動検出し、devDependenciesに保存できるようになった。
- 使い方:
pnpm add --save-types。-Dを付けると両方をdevDependenciesに保存する- 対応範囲: スコープ付きパッケージ、npm エイリアス、フィルタ済みワークスペース、カタログ、save-prefix 設定、lockfile-only インストールに対応。既存の・明示指定された型依存が優先される。
saveTypes: trueをpnpm-workspace.yamlに設定すると既定で有効化できる
📦 v12.6.0 · トピック: CLI コマンド
macOS の Time Machine から新規ディレクトリを除外するオプションを追加(#8522)
何ができるようになったか
オプトインの
macosBackup.excludeModulesDir/excludeStoreDirを有効にすると、インストール前に存在しなかったディレクトリを記録し、新規作成されたnode_modules・virtual store・グローバルストアを Time Machine の除外対象にできるようになった(tmutil addexclusionを使用)。
- 使い方: グローバル pnpm 設定(YAML)または環境変数
PNPM_CONFIG_MACOS_BACKUP_EXCLUDE_MODULES_DIR/_STORE_DIRでtrueに設定- 既定: 両方
falseで従来通り。マシンローカルな設定で、プロジェクトのpnpm-workspace.yamlからは上書きできない
📦 v12.6.0 · トピック: CLI コマンド
--force でもプラットフォームフィルタを効かせる forceIgnoresPlatform を追加(#15330)
何ができるようになったか
pnpm install --forceは npm 6 由来の挙動で、os/cpu/libcを問わず全プラットフォームの optional dependencies をインストールしていた(npm 7 や Yarn/Bun はそうしない)。新設定forceIgnoresPlatformで pnpm v12 の既定を変更した。
- v12 の既定:
false。--forceは引き続き全パッケージの再取得とengineStrictの解除は行うが、プラットフォームが一致しない optional dependencies はスキップされる- v11 の既定:
true(従来通り)。両バージョンとも設定キーを認識するため、pnpm-workspace.yamlで設定しても未知キー警告は出ない
移行が必要
v12 で
--forceの古い「全プラットフォームインストール」動作に依存していた場合は、forceIgnoresPlatform: trueを設定して復元する必要がある。
⏳ 未リリース · トピック: マルチエコシステム設定
pnpm publish --publish-wait-timeout でレジストリの反映待ちに対応(#15291)
何ができるようになったか
レジストリが公開直後にメタデータや tarball を利用可能にする前にアップロードを受け付けることがある(GitHub の公開時マルウェアスキャン等)。
--publish-wait-timeout <ミリ秒>を指定すると、公開後に利用可能になるまで確認してから続行するようになった。
- 確認方法: インストールメタデータの厳密なバージョン一致と、tarball への HTTP HEAD
200レスポンスを確認- 範囲: 再帰 publish は依存先を公開する前に待つ。タイムアウトはパッケージごと、または
--batch時はアップロードしたレジストリグループごとに適用。publishWaitTimeout設定で既定値を指定でき、0で無効化
⏳ 未リリース · トピック: CLI コマンド
グローバル Node シムが .nvmrc も読むように(#15247)
何ができるようになったか
pnpm のコンテキスト対応グローバル
nodeシムが、必要な Node.js バージョンの追加のソースとして最も近い.nvmrcを読めるようになった。
- 優先順位: 同じディレクトリでは
devEngines.runtime/engines.runtimeの宣言が引き続き優先。ディレクトリをまたぐ場合は最も近い宣言が勝つ- 対応形式: コメント・設定行・
vプレフィックス・一般的な nvm エイリアスを解釈できる
⏳ 未リリース · トピック: ランタイム管理
Yarn/npm 由来の package.json の workspaces から pnpm-workspace.yaml を自動生成(#15348)
何ができるようになったか
Yarn/npm から移行したリポジトリが
package.jsonのworkspacesにワークスペース定義を持っていても、pnpm はこれまで読まず単一プロジェクトとして警告付きでインストールしていた。配列形式で有効なパターンが1つ以上あり、pnpm-workspace.yamlが存在しない場合、install 系コマンド(install・add・update・remove・dedupe・prune・deploy・unlink)がそのパターンでpnpm-workspace.yamlを作成し、設定をそこに固定するようになった。
- 変わらない点: 既存の
pnpm-workspace.yaml(シンボリックリンクを含む)は変更・追従しない。--ignore-workspaceを付けた場合や--lockfile-dirがプロジェクト外の場合はファイルを作らず、従来の警告のまま- 範囲: v12 のみの新機能
⏳ 未リリース · トピック: CLI コマンド
グローバル Node シムが .node-version にも対応(#15398)
何ができるようになったか
#15247 の
.nvmrc対応に続き、.node-version(fnm・n・nodenv・asdf・mise・setup-node が読む形式)も読めるようになった。
- 形式: 1行に1バージョン(
vは任意)というシンプルな形式で、.nvmrc文法の部分集合のため共通のパーサーで読む- 優先順位: 同じディレクトリでは
package.jsonの宣言 →.node-version→.nvmrcの順(fnm・n と同じ)。ディレクトリをまたぐ場合は最も近い宣言が勝つ
⏳ 未リリース · トピック: ランタイム管理
エンジン/ランタイムのロック待ちを最大5秒に短縮、待ちきれない場合は専用コピーで実行(#15417)
何ができるようになったか
プロジェクトが pnpm バージョンや管理対象ランタイムを固定していると、共有のグローバル virtual store のスロットにロックを取ってインストールする。従来はロックが取られていると最大5分待ってからロック無しでスロットに入っていたが、#15394 以降デッドロックホルダーのロックは即座に引き継がれるようになったため、待つ方が遅くなる場合があった。
- 変更点: 待機を5秒にし、それでも空かない場合はプロセス専用のプライベートディレクトリ(ストアの
tmp/private配下)にインストールしてそこから実行する。共有スロットには決してロック無しで入らない- 後片付け: プライベートコピーはコマンド終了直後に削除される。
pnpm store pruneは、強制終了したプロセスなどが残した使用中でないプライベートインストールも削除する
⏳ 未リリース · トピック: ランタイム管理
変更・修正
なし(詳しく確認した PR はすべて新機能に分類されたため)
その他
maxPrs の上限により、残り 291 件はタイトルのみの簡易情報(body/files なし)。件数が多いため、タイトルの接頭辞(Conventional Commits 形式)や領域ごとにまとめて記載する。内訳は 📦 v12.6.0 収録 169 件 / ⏳ 未リリース 122 件。
fix(install)など依存解決・キャッシュまわり — 61 件(install/deps-restorer/resolver/resolving/lockfile/store/catalogs/tarball/dedupe/fsなどの細かい不具合修正)fix(cli)/fix(config)など CLI・設定まわり — 51 件(exec/run/dlx/global/hooks/scripts/setupなどコマンド実行・設定読み込みの細かい修正)fix全般・個別コマンド関連の細かい修正 — 77 件(audit/deploy/update/git/list/peers/ci/remove/network/patch/pack/hoisted/licenses/filterなど、多岐にわたる個別領域の修正)fix(workspace)/fix(manifest)などワークスペース・マニフェストまわり — 19 件(workspace/manifest/overrides/version/publish/cmd-shim/package-managerなど)fix(pacquet)/fix(cargo)など Rust 版 pacquet・Cargo 対応まわり — 9 件fix(python*)など Python 対応の細かい修正 — 7 件- テスト・内部整理・ドキュメント・パフォーマンス改善 — 66 件(
test:27 件、chore:15 件、perf:10 件、docs:7 件、refactor:6 件、ci:1 件、いずれも利用者向けの挙動変更なし) feat(cli): accept --trust-lockfile and --no-trust-lockfile on remove(#15517)⏳ 未リリース —maxPrsの枠に入らなかった唯一の新機能 PR。pnpm removeに--trust-lockfile/--no-trust-lockfileを追加