{"_id":"@asuka1975/pnpm-plugin-frontend-library-catalog","_rev":"3-d638e82b3f30d081e2c4111e6282151b","name":"@asuka1975/pnpm-plugin-frontend-library-catalog","dist-tags":{"latest":"1.0.3"},"versions":{"1.0.0":{"name":"@asuka1975/pnpm-plugin-frontend-library-catalog","version":"1.0.0","license":"MIT","_id":"@asuka1975/pnpm-plugin-frontend-library-catalog@1.0.0","maintainers":[{"name":"asuka1975","email":"shikina.asuka@gmail.com"}],"dist":{"shasum":"6827a5b90d46adda51eef53e8a4205d661857a45","tarball":"https://registry.npmjs.org/@asuka1975/pnpm-plugin-frontend-library-catalog/-/pnpm-plugin-frontend-library-catalog-1.0.0.tgz","fileCount":4,"integrity":"sha512-ubG+ziQM393zBClOPoWMsITTyaUwyYFyTPua9fuGFnILDOqcfU+SOnACfHR7ZQcWKR4YQ6pXU9vDaChlQZoFGg==","signatures":[{"sig":"MEUCIQCgattlCAbseA2pofIvRFdtNiSz7jiiZXtx2YD/z/Hl4QIgOA0HlKYocK0nu/HMd360B6LO1ull8A7Z5eITA/bGqzc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":22985},"type":"module","scripts":{"test":"node --test test/*.test.mjs","catalog":"node scripts/print-catalog.mjs"},"_npmUser":{"name":"asuka1975","email":"shikina.asuka@gmail.com"},"description":"React プロジェクトのライブラリバージョンを統一する pnpm カタログ","directories":{},"_nodeVersion":"26.0.0","_hasShrinkwrap":false,"devDependencies":{"idb":"^8.0.3","msw":"^2.15.0","swr":"^2.4.2","zod":"^4.4.3","clsx":"^2.1.1","vite":"^8.1.5","immer":"^11.1.15","jsdom":"^30.0.0","react":"^19.2.8","eslint":"^10.8.0","vitest":"^4.1.10","xstate":"^5.32.5","globals":"^17.8.0","zustand":"^5.0.14","date-fns":"^4.4.0","prettier":"^3.9.6","happy-dom":"^20.11.1","react-dom":"^19.2.8","@vitest/ui":"^4.1.10","typescript":"^7.0.2","@types/node":"^26.1.2","react-redux":"^9.3.0","tailwindcss":"^4.3.3","@types/react":"^19.2.17","react-router":"^8.3.0","@xstate/react":"^6.1.0","@vitest/browser":"^4.1.10","react-hook-form":"^7.83.0","@playwright/test":"^1.62.0","@reduxjs/toolkit":"^2.12.0","@types/react-dom":"^19.2.3","@tailwindcss/vite":"^4.3.3","styled-components":"^6.4.4","typescript-eslint":"^8.65.0","@hookform/resolvers":"^5.5.7","@vitest/coverage-v8":"^4.1.10","@axe-core/playwright":"^4.12.1","@testing-library/dom":"^10.4.1","@vanilla-extract/css":"^1.21.2","@vitejs/plugin-react":"^6.0.4","@tanstack/react-query":"^5.101.4","@testing-library/react":"^16.3.2","@vanilla-extract/recipes":"^0.5.7","@testing-library/jest-dom":"^7.0.0","eslint-plugin-react-hooks":"^7.1.1","@testing-library/user-event":"^14.6.1","@vanilla-extract/vite-plugin":"^5.2.6","@tanstack/react-query-devtools":"^5.101.4","@tanstack/react-query-persist-client":"^5.101.4","@tanstack/query-sync-storage-persister":"^5.101.4"},"_npmOperationalInternal":{"tmp":"tmp/pnpm-plugin-frontend-library-catalog_1.0.0_1787667642323_0.16565615494762742","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@asuka1975/pnpm-plugin-frontend-library-catalog","version":"1.0.2","license":"MIT","_id":"@asuka1975/pnpm-plugin-frontend-library-catalog@1.0.2","maintainers":[{"name":"asuka1975","email":"shikina.asuka@gmail.com"}],"homepage":"https://github.com/asuka1975/frontend-library-catalog#readme","bugs":{"url":"https://github.com/asuka1975/frontend-library-catalog/issues"},"dist":{"shasum":"de4258f318cfdd2c0c0966d8a4ece558edfb5736","tarball":"https://registry.npmjs.org/@asuka1975/pnpm-plugin-frontend-library-catalog/-/pnpm-plugin-frontend-library-catalog-1.0.2.tgz","fileCount":4,"integrity":"sha512-AifkzTE+6MX4NsV3Q2a+fbie6cmF3RWk8Y5Aof8k8EZCjOuIw4V4IweL+VDbWERWnFvJLG9ysb5ZCwBI+INIYw==","signatures":[{"sig":"MEQCIC9nU9MuNJ/LHyBcV5KtpBi/1WAKVckkd4rd+z52Bu3FAiATTmc31CYWJf+0eomIDb2crJHOcR3jzsm/CdB3SsvIFw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@asuka1975%2fpnpm-plugin-frontend-library-catalog@1.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":24660},"type":"module","gitHead":"a518120642d80b33b9843d2ecc131c848948700b","scripts":{"test":"node --test test/*.test.mjs","catalog":"node scripts/print-catalog.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:81b8c2b1-51fe-4962-964c-c5bd9aa3809d"}},"repository":{"url":"git+https://github.com/asuka1975/frontend-library-catalog.git","type":"git"},"_npmVersion":"11.17.0","description":"React プロジェクトのライブラリバージョンを統一する pnpm カタログ","directories":{},"_nodeVersion":"24.19.0","_hasShrinkwrap":false,"packageManager":"pnpm@11.5.1","devDependencies":{"idb":"^8.0.3","msw":"^2.15.0","swr":"^2.4.2","zod":"^4.4.3","clsx":"^2.1.1","vite":"^8.2.1","immer":"^11.1.16","jsdom":"^30.0.0","react":"^19.2.8","eslint":"^10.8.0","vitest":"^4.1.10","xstate":"^5.32.5","globals":"^17.8.0","zustand":"^5.0.14","date-fns":"^4.4.0","prettier":"^3.9.6","happy-dom":"^20.11.1","react-dom":"^19.2.8","@vitest/ui":"^4.1.10","typescript":"^7.0.2","@types/node":"^26.1.2","react-redux":"^9.3.0","tailwindcss":"^4.3.3","@types/react":"^19.2.17","react-router":"^8.3.0","@xstate/react":"^6.1.0","@vitest/browser":"^4.1.10","react-hook-form":"^7.83.0","@playwright/test":"^1.62.0","@reduxjs/toolkit":"^2.12.0","@types/react-dom":"^19.2.3","@tailwindcss/vite":"^4.3.3","styled-components":"^6.4.4","typescript-eslint":"^8.65.0","@hookform/resolvers":"^5.7.1","@vitest/coverage-v8":"^4.1.10","@axe-core/playwright":"^4.12.1","@testing-library/dom":"^10.4.1","@vanilla-extract/css":"^1.21.2","@vitejs/plugin-react":"^6.0.4","@tanstack/react-query":"^5.101.4","@testing-library/react":"^16.3.2","@vanilla-extract/recipes":"^0.5.7","@testing-library/jest-dom":"^7.0.0","eslint-plugin-react-hooks":"^7.1.1","@testing-library/user-event":"^14.6.3","@vanilla-extract/vite-plugin":"^5.2.6","@tanstack/react-query-devtools":"^5.101.4","@tanstack/react-query-persist-client":"^5.101.4","@tanstack/query-sync-storage-persister":"^5.101.4"},"_npmOperationalInternal":{"tmp":"tmp/pnpm-plugin-frontend-library-catalog_1.0.2_1787715521487_0.9642678149721642","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@asuka1975/pnpm-plugin-frontend-library-catalog","version":"1.0.3","description":"React プロジェクトのライブラリバージョンを統一する pnpm カタログ","license":"MIT","repository":{"type":"git","url":"git+https://github.com/asuka1975/frontend-library-catalog.git"},"type":"module","packageManager":"pnpm@11.5.1","scripts":{"catalog":"node scripts/print-catalog.mjs","test":"node --test test/*.test.mjs"},"devDependencies":{"@axe-core/playwright":"^4.12.1","@hookform/resolvers":"^5.7.1","@playwright/test":"^1.62.0","@reduxjs/toolkit":"^2.12.0","@tailwindcss/vite":"^4.3.3","@tanstack/query-sync-storage-persister":"^5.101.4","@tanstack/react-query":"^5.101.4","@tanstack/react-query-devtools":"^5.101.4","@tanstack/react-query-persist-client":"^5.101.4","@testing-library/dom":"^10.4.1","@testing-library/jest-dom":"^7.0.0","@testing-library/react":"^16.3.2","@testing-library/user-event":"^14.6.3","@types/node":"^26.1.2","@types/react":"^19.2.17","@types/react-dom":"^19.2.3","@vanilla-extract/css":"^1.21.2","@vanilla-extract/recipes":"^0.5.7","@vanilla-extract/vite-plugin":"^5.2.6","@vitejs/plugin-react":"^6.0.4","@vitest/browser":"^5.0.0","@vitest/coverage-v8":"^5.0.0","@vitest/ui":"^5.0.0","@xstate/react":"^6.1.0","clsx":"^2.1.1","date-fns":"^4.4.0","eslint":"^10.8.0","eslint-plugin-react-hooks":"^7.1.1","globals":"^17.8.0","happy-dom":"^20.11.1","idb":"^8.0.3","immer":"^11.1.16","jsdom":"^30.0.0","msw":"^2.15.0","prettier":"^3.9.6","react":"^19.2.8","react-dom":"^19.2.8","react-hook-form":"^7.83.0","react-redux":"^9.3.0","react-router":"^8.3.0","styled-components":"^6.4.4","swr":"^2.4.2","tailwindcss":"^4.3.3","typescript":"^7.0.2","typescript-eslint":"^8.65.0","vite":"^8.2.1","vitest":"^5.0.0","xstate":"^5.32.5","zod":"^4.4.3","zustand":"^5.0.14"},"gitHead":"4fece9def8e15383163028bd4ed25891b9402df5","_id":"@asuka1975/pnpm-plugin-frontend-library-catalog@1.0.3","bugs":{"url":"https://github.com/asuka1975/frontend-library-catalog/issues"},"homepage":"https://github.com/asuka1975/frontend-library-catalog#readme","_nodeVersion":"24.20.0","_npmVersion":"11.19.0","dist":{"integrity":"sha512-vZplsUUaZahMKqqBx9pT3YqP04xUj/5LAaHpJHx1OGYwlV/ut2CTVtKLqZbYhWTN4ITYIYa7JBkdnwyjTGrZVg==","shasum":"f70d8136023559e8f6491e3b915cb8fdb38dbd50","tarball":"https://registry.npmjs.org/@asuka1975/pnpm-plugin-frontend-library-catalog/-/pnpm-plugin-frontend-library-catalog-1.0.3.tgz","fileCount":4,"unpackedSize":24656,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@asuka1975%2fpnpm-plugin-frontend-library-catalog@1.0.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDxE/jb3EvmjpRw+K98T586dEsjPy3v/DzT4iWWETScLgIgHA+o/jhPFEpVP16DtusK4O8HeLVtzZGynRpo2EAl5kM="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:81b8c2b1-51fe-4962-964c-c5bd9aa3809d"}},"directories":{},"maintainers":[{"name":"asuka1975","email":"shikina.asuka@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pnpm-plugin-frontend-library-catalog_1.0.3_1789088921205_0.7223166327615025"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-25T14:20:42.180Z","modified":"2026-09-11T01:08:41.630Z","1.0.0":"2026-08-25T14:20:42.493Z","1.0.2":"2026-08-26T03:38:41.611Z","1.0.3":"2026-09-11T01:08:41.325Z"},"bugs":{"url":"https://github.com/asuka1975/frontend-library-catalog/issues"},"license":"MIT","homepage":"https://github.com/asuka1975/frontend-library-catalog#readme","repository":{"type":"git","url":"git+https://github.com/asuka1975/frontend-library-catalog.git"},"description":"React プロジェクトのライブラリバージョンを統一する pnpm カタログ","maintainers":[{"name":"asuka1975","email":"shikina.asuka@gmail.com"}],"readme":"# frontend-library-catalog\n\n複数の React プロジェクトで使うライブラリの**バージョンを統一する**ためのカタログです。\npnpm の catalog と config dependency を組み合わせ、1 つの npm パッケージとして発行します。\n\n利用側は依存にバージョンを書かず、`catalog:` とだけ書きます。\n\n```json\n{\n  \"dependencies\": {\n    \"react\": \"catalog:\",\n    \"zustand\": \"catalog:\",\n    \"@tanstack/react-query\": \"catalog:\"\n  }\n}\n```\n\n```\nfrontend-library-catalog/\n├── package.json          ← ここにバージョンを書く（devDependencies が正本）\n├── catalog.mjs           ← devDependencies をカタログとして公開する\n├── pnpmfile.mjs          ← pnpm が読み込むフック\n├── pnpm-workspace.yaml   ← このリポジトリ自身の設定（公開物には含めない）\n├── scripts/, test/\n└── .github/\n    ├── dependabot.yml\n    ├── workflows/dependabot-review-release.yml   ← レビュー・マージ・リリース\n    └── scripts/                                  ← ワークフローから呼ぶ部品\n```\n\n## kotlin-library-catalog との違い\n\n| | kotlin-library-catalog | frontend-library-catalog |\n| --- | --- | --- |\n| 仕組み | `java-platform` の BOM | pnpm catalog + config dependency |\n| 定義場所 | `build.gradle.kts` の `constraints` | `package.json` の `devDependencies` |\n| 利用側の書き方 | `implementation(\"io.ktor:ktor-client-cio\")` | `\"react\": \"catalog:\"` |\n| 配布 | JitPack（git タグから） | npm レジストリ |\n| 利用側と衝突したとき | 高い方が選ばれる | **利用側が優先** |\n\n衝突時の挙動が逆である点に注意してください。BOM は Gradle が高い方を選びますが、\nこのカタログは利用側の `pnpm-workspace.yaml` に同名の定義があればそちらを優先します。\nカタログ全体を捨てずに、必要な 1 つだけ差し替えられるようにするためです。\n\n### JitPack に相当する配布方法はありません\n\nconfig dependency は integrity（ハッシュ）の検証を必須にしているため、\nローカルの tgz や git 参照では入りません。次のように拒否されます。\n\n```\n[ERROR] Cannot resolve @asuka1975/pnpm-plugin-frontend-library-catalog@file:../catalog.tgz\n        as a configuration dependency because it has no integrity\n```\n\nnpm レジストリへの publish が必要です。\n\n## 仕組み\n\npnpm の catalog はそのままでは 1 つのワークスペース内でしか共有できません。\nリポジトリをまたいで配るために config dependency を使います。\n\n```\n利用側の pnpm-workspace.yaml\n└── configDependencies\n    └── @asuka1975/pnpm-plugin-frontend-library-catalog: 1.0.0\n            │\n            │ pnpm が通常の依存より先にインストールし、\n            │ パッケージ名が @<scope>/pnpm-plugin-* なので\n            │ pnpmfile.mjs を自動で読み込む\n            ↓\n        updateConfig フック\n            └── config.catalogs.default にカタログを流し込む\n                    ↓\n            利用側の \"react\": \"catalog:\" が解決される\n```\n\nパッケージ名の `pnpm-plugin-` は必須です。pnpm が `pnpmfile.mjs` を自動で読み込むのは\n`pnpm-plugin-*` / `@<scope>/pnpm-plugin-*` / `@pnpm/plugin-*` のいずれかに一致する名前だけです。\n名前を変えるときはこの規則を外さないでください（`pnpm test` で検査しています）。\n\n## ライブラリを追加・更新する\n\n`package.json` の `devDependencies` を編集します。\n\n```json\n{\n  \"devDependencies\": {\n    \"zustand\": \"^5.0.14\"\n  }\n}\n```\n\nこれだけです。`catalog.mjs` は `devDependencies` をそのまま公開しているので、\n編集は不要です。\n\n### なぜ devDependencies なのか\n\n1. **Dependabot と Renovate がそのまま解釈できる。**\n   バージョンを独自形式のファイルに書くと、更新は全部手作業になります。\n2. **config dependency は通常の `dependencies` を持てない。**\n   `devDependencies` は利用側にインストールされないので、この制約に抵触しません。\n3. **`pnpm install` が組み合わせの検証になる。**\n   カタログに載せた全ライブラリが実際に一緒に解決できるかを、このリポジトリで確認できます。\n\n## Dependabot と自動リリース\n\n更新 PR のレビューからリリースまでは\n`.github/workflows/dependabot-review-release.yml` が毎週やります。手で回したいときは\n`/dependabot-merge`（`.claude/skills/dependabot-merge/`）を使います。手順は同じで、\nレビューするモデルだけが違います（CI は codex-fugu、手元は Opus）。\n\n```\n月曜 09:00 JST  Dependabot が package.json を走査して更新 PR を作る\n      │ 15 時間\n火曜 00:00 JST  ワークフローが起きる\n      ↓\n   collect   開いている Dependabot PR を列挙する\n      ↓\n   review    PR ごとに 1 ジョブ。codex-fugu が脆弱性・上流差分・npm 上の実物を\n             調べ、MERGE / HOLD の評決を JSON で返す（トークンは読み取り専用）\n      ↓\n   apply     評決に従ってマージ / クローズ。マージ後の main で\n             pnpm install --frozen-lockfile && pnpm test を通してから\n             パッチを +1 してタグを push（レビュー内容はコミットメッセージに残る）\n      ↓\n   publish   タグの中身を npm に publish（trusted publishing）\n```\n\nジョブを分けているのは権限のためです。レビューするモデルが読むのは上流のリリースノートや\nnpm レジストリの応答、つまり **攻撃者が書ける文章** です。それを読んだエージェント自身が\nマージまでできてしまうと、このワークフローが防ごうとしている攻撃がそのまま通ります。\nだから review ジョブのトークンは読み取り専用にし、マージとタグ push は評決 JSON だけを\n受け取った apply ジョブが行い、publish ジョブには書き込み権限を持たせません。\n\n判断するのはセキュリティだけです。破壊的変更・メジャーアップ・非推奨化は HOLD の理由に\nしません（コミットログの「注意」欄に残します）。互換性の問題は利用側のビルドや型検査で\n顕在化しますが、脆弱性は黙って通ります。見ているのは後者だけです。\n\n### 用意するもの\n\n- リポジトリの secret `SAKANA_API_KEY` — レビューに使う codex-fugu の API キー\n- npm の trusted publisher 設定 — 下の「npm への publish」\n\n### 試してから任せる\n\nActions のページから手で起動できます。`dry_run` は既定で on で、レビューと検証だけを行い、\nマージ・クローズ・リリースはしません。評決は実行の成果物（`verdict-*`）に残ります。\n\n`publish_tag` に既存のタグを入れると、PR を一切見ずにそのタグを publish するだけの\n実行になります（下の「タグを指定して publish する」）。\n\n### 自動では入らないもの\n\n- **`package.json` / `pnpm-lock.yaml` / `.github/workflows/*.yml` 以外を触る PR。**\n  評決が MERGE でも取り込みません。モデルの読み間違いに委ねてよい判断ではないので、\n  ワークフローが機械的に見ています。author は Dependabot なので攻撃の兆候というより\n  前提が変わった合図です。クローズせず open のまま残します。\n- **公開直後（24 時間以内）のバージョンが必要になった回。** `pnpm-workspace.yaml` の\n  `minimumReleaseAge` は供給網対策として置いている待ち時間なので、自動では緩めません。\n  マージは済んでいるので、時間を置いて再実行すればリリースまで通ります。\n\nGitHub Actions の更新だけがマージされた回は、バージョンを上げません。公開物\n（`package.json` / `catalog.mjs` / `pnpmfile.mjs`）が変わっておらず、publish しても中身が\n同じになるためです。\n\nマージが何らかの理由で拒否された PR（ブランチ保護、必須チェックの未達など）は、\nその 1 件だけ open のまま残り、他の PR とリリースは進みます。\n\n### groups\n\n`groups` でまとめてあるのは、揃えて更新しないと壊れるライブラリ群\n（`react` と `react-dom`、`@tanstack/*` など同一バージョン系列のもの）だけです。\n分野が近いだけのライブラリはまとめていません。個別に PR が来る方が、\n壊れたときに原因を特定しやすいためです。\n\n## ローカルで確認する\n\n```bash\npnpm install   # 全ライブラリが一緒に解決できるか\npnpm test      # カタログとフックの整合性\npnpm catalog   # 現在のカタログを表として出力\n```\n\n`pnpm install` は依存のビルドスクリプトを実行しません（`pnpm-workspace.yaml` の `allowBuilds`）。\nこのリポジトリはバージョンの解決を確認するだけで、ビルドも実行もしないためです。\n\nREADME にバージョンの一覧を転記していないのは、Dependabot の更新から取り残されて\n嘘になるためです。一覧が必要なときは `pnpm catalog` を使ってください。\n\n## npm への publish\n\nバージョンは `package.json` の `version` です。利用側は exact version で参照するため、\nカタログを更新したら version を上げて publish し直します。この上げ下ろしは上の\nワークフローがやるので、通常は手を出しません。\n\npublish にトークンは使いません。npm の\n[trusted publishing](https://docs.npmjs.com/trusted-publishers#configuring-trusted-publishing)\nを使い、GitHub Actions が発行する OIDC トークンと引き換えに、その実行の間だけ有効な\n資格情報を npm から受け取ります。**漏れて困る長期の資格情報がそもそも存在しません。**\nCI に `NPM_TOKEN` を置く必要はなく、置いてもいけません。\n\n### 1. 最初の 1 回だけ手で publish する\n\nnpm は **パッケージが存在しないと trusted publisher を設定できません**。\n最初のバージョンだけは手元から上げてください。\n\n```bash\ngit status --porcelain   # 空であること\ngit push                 # origin/main と同じところにいること\nnpm login\npnpm publish --access public\n```\n\n`pnpm publish` は publish 前に git を見ます。作業ツリーが汚れていると\n`ERR_PNPM_GIT_UNCLEAN`、origin と揃っていないと `ERR_PNPM_BRANCH_IS_NOT_UP_TO_DATE` で\n止まります。**`--no-git-checks` で黙らせないでください。** publish したものは\n二度と差し替えられないので、「npm 上のこのバージョンは、この commit である」が\n言えなくなると後から追えません。先にコミットして push します。\n\nパッケージ名の scope（`@asuka1975`）は npm のアカウント名または organization 名と\n一致している必要があります。scope を変える場合は `package.json` の `name` を変更します。\nその際も `pnpm-plugin-` の部分は残してください（`pnpm test` で検査しています）。\n\n### 2. trusted publisher を登録する\n\nnpmjs.com のパッケージ設定 → **Trusted Publisher** → **GitHub Actions** で次を入れます。\n\n| 項目 | 値 |\n| --- | --- |\n| Organization or user | `asuka1975` |\n| Repository | `frontend-library-catalog` |\n| Workflow filename | `dependabot-review-release.yml` |\n| Environment name | 空のまま |\n| Allowed actions | `npm publish` |\n\n**Workflow filename はパスではなくファイル名だけ**です。ここに登録した名前と実際に\npublish するワークフローのファイル名が違うと 403 になります。\n`.github/workflows/dependabot-review-release.yml` をリネームするときは、npm 側も直してください。\n\n以降は、ワークフローがタグを push した回に publish まで自動で進みます。\n\n### 前提\n\n- publish ジョブに `id-token: write` が要ります（OIDC トークンの発行に必要）。\n  そのジョブには書き込み権限を渡していないので、publish 以外のことはできません\n- npm CLI 11.5.1 以上、Node 22.14 以上。ワークフローは Node 24 を使い、同梱の npm が\n  古ければ上げてから publish します\n- publish は `pnpm publish` ではなく **`npm publish`** です。npm のドキュメントが前提に\n  しているのは npm CLI で、pnpm 側の OIDC 対応はバージョンによって挙動が変わってきた\n  経緯があります（[pnpm#11513](https://github.com/pnpm/pnpm/issues/11513)）。\n  このパッケージ自身の `package.json` は `catalog:` を使っていないため、`pnpm publish` の\n  展開処理は要らず、公開物は同じものになります\n- 公開リポジトリなので、provenance（どのワークフローのどのコミットから作られたか）が\n  自動で付きます。`--provenance` は要りません\n- **その provenance の検証が `package.json` の `repository` と突き合わせます。** 空だと\n  `422 Unprocessable Entity ... \"repository.url\" is \"\"` で落ちます。認証が通った後、\n  publish の瞬間に落ちるので気づきにくく、`pnpm test` で検査しています\n- self-hosted ランナーからは使えません\n\n### タグを指定して publish する\n\npublish だけが失敗した回や、Dependabot PR に乗らない修正を出したいときは、タグを\n指定してワークフローを起動します。レビューもマージもリリースも行わず、そのタグの\n中身を npm に上げるだけです。provenance も付きます。\n\n```bash\ngh workflow run dependabot-review-release.yml -f publish_tag=1.0.2\n```\n\nDependabot PR が 1 件も無くてもリリースできる経路が要るのは、publish 側の設定を\n直したときに実際に困ったためです（タグは打てたが、直したものを運ぶ PR がどこにも\n無い）。その場合は手でバージョンを上げてタグを打ってから、上のコマンドで publish\nします。\n\n```bash\nnode .claude/skills/dependabot-merge/scripts/next-version.mjs --apply\ngit commit -am \"Bump version to <新バージョン>\"\ngit tag <新バージョン>\ngit push origin main <新バージョン>\ngh workflow run dependabot-review-release.yml -f publish_tag=<新バージョン>\n```\n\n**publish に失敗しても、push 済みのタグやコミットは巻き戻さないでください。**\nnpm に上がっていないのはその 1 バージョンだけです。npm は一度使ったバージョン番号を\n再利用できませんが、**届かなかった番号は欠番にして次へ進めます。**\n\n### 手元から publish するとき\n\ntrusted publishing は CI からしか効きません。手元から上げると provenance は付きません。\nそれでも構わない場合だけ、従来どおり `npm login` してから上げます。\n\n```bash\ngit checkout <タグ>\nnpm publish --access public\n```\n\n## 利用側の設定\n\n### 1. カタログを追加する\n\n```bash\npnpm add --config @asuka1975/pnpm-plugin-frontend-library-catalog\n```\n\n`pnpm-workspace.yaml` に次が書き込まれます。integrity は `pnpm-lock.yaml` に入ります。\n\n```yaml\nconfigDependencies:\n  '@asuka1975/pnpm-plugin-frontend-library-catalog': 1.0.0\n```\n\n### 2. バージョンを書かずに依存を宣言する\n\n```json\n{\n  \"dependencies\": {\n    \"react\": \"catalog:\",\n    \"react-dom\": \"catalog:\",\n    \"@tanstack/react-query\": \"catalog:\"\n  },\n  \"devDependencies\": {\n    \"vite\": \"catalog:\",\n    \"vitest\": \"catalog:\",\n    \"@testing-library/react\": \"catalog:\",\n    \"msw\": \"catalog:\"\n  }\n}\n```\n\n```bash\npnpm install\n```\n\n### 一部だけ違うバージョンを使う\n\n利用側の `pnpm-workspace.yaml` に書いた定義が優先されます。\n\n```yaml\ncatalog:\n  react: 19.1.0     # これが勝つ。他はカタログの値のまま\n```\n\n## 使うときの注意\n\n### `pnpm add <pkg>@catalog:` はカタログを複製する\n\nこのコマンドは、解決したバージョンを利用側の `pnpm-workspace.yaml` に**書き込みます**。\n\n```yaml\n# pnpm add zustand@catalog: の後\ncatalog:\n  zustand: ^5.0.14   # カタログと同じ値がコピーされる\n```\n\nこうなると、カタログ側を更新しても利用側はコピーされた値を使い続けます。\n`package.json` に `\"catalog:\"` と手で書いて `pnpm install` してください。\nすでにコピーされている場合は、`pnpm-workspace.yaml` から該当行を消せば元に戻ります。\n\n### publish 時に実際のバージョンへ展開される\n\nライブラリを npm に公開する場合、`pnpm publish` / `pnpm pack` が `catalog:` を\n実際の範囲へ置き換えます。`peerDependencies` も同様です。\n\n```json\n// 手元\n{ \"peerDependencies\": { \"react\": \"catalog:\" } }\n\n// 公開されるもの\n{ \"peerDependencies\": { \"react\": \"^19.2.8\" } }\n```\n\n利用側が pnpm でなくても問題ありません。\n\n### 必要なバージョン\n\n`updateConfig` フックは pnpm 10.8 以降です。動作確認は **pnpm 11.5.1** で行っています。\n\n## 迷った場合の標準構成\n\nカタログは「使ってよいバージョン」を決めるだけで、「何を使うか」は決めません。\nReact + Vite の業務 SPA なら、まずこれで始めます。\n\n```json\n{\n  \"dependencies\": {\n    \"react\": \"catalog:\",\n    \"react-dom\": \"catalog:\",\n    \"react-router\": \"catalog:\",\n    \"@tanstack/react-query\": \"catalog:\"\n  },\n  \"devDependencies\": {\n    \"vite\": \"catalog:\",\n    \"@vitejs/plugin-react\": \"catalog:\",\n    \"typescript\": \"catalog:\",\n    \"vitest\": \"catalog:\",\n    \"@testing-library/react\": \"catalog:\",\n    \"@testing-library/user-event\": \"catalog:\",\n    \"msw\": \"catalog:\",\n    \"@playwright/test\": \"catalog:\"\n  }\n}\n```\n\nZustand は必要になってから足します。Redux Toolkit は、プロジェクト開始時に儀式として\n追加するものではありません。複雑な共有クライアント状態が実際に存在する場合に選びます。\n\n## 管理しているライブラリ\n\nバージョンは `pnpm catalog` で確認できます（正本は `package.json` の `devDependencies`）。\n\n| 分野 | ライブラリ |\n| --- | --- |\n| React | `react` / `react-dom` / `@types/react` / `@types/react-dom` |\n| ルーティング | `react-router` |\n| 状態管理 | `zustand` / `@reduxjs/toolkit` / `react-redux` / `xstate` / `@xstate/react` / `immer` |\n| API キャッシュ | `@tanstack/react-query` / `-devtools` / `-persist-client` / `@tanstack/query-sync-storage-persister` / `swr` |\n| フォーム・検証 | `react-hook-form` / `@hookform/resolvers` / `zod` |\n| スタイリング | `tailwindcss` / `@tailwindcss/vite` / `@vanilla-extract/css` / `-vite-plugin` / `-recipes` / `styled-components` / `clsx` |\n| ビルド | `vite` / `@vitejs/plugin-react` / `typescript` |\n| テスト | `vitest` / `@vitest/browser` / `-coverage-v8` / `-ui` / `@testing-library/react` / `-dom` / `-user-event` / `-jest-dom` / `msw` / `jsdom` / `happy-dom` |\n| E2E・a11y | `@playwright/test` / `@axe-core/playwright` |\n| 静的解析 | `eslint` / `typescript-eslint` / `eslint-plugin-react-hooks` / `globals` / `prettier` |\n| その他 | `idb` / `date-fns` / `@types/node` |\n\n用途の重なるライブラリ（TanStack Query と SWR、jsdom と happy-dom など）を両方載せているのは\n意図的です。カタログは選択肢を並べてバージョンだけを固定するもので、使われない項目は\nインストールされません。どれを選ぶかの指針はこのリポジトリの責務外です。\n\nCSS Modules は Vite に組み込みのため、追加のライブラリはありません。\n","readmeFilename":"README.md"}