期間: 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 コマンド

何ができるようになったか

これまで 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 を追加