package-publishing について
npm パッケージの作成者向けスキルです。エントリーポイント設定、ESM/CJS の両形式ビルド、TypeScript 宣言、provenance を伴う公開を扱い、設定やモジュール解決の問題にも対応します。
主な機能
- 01exports と条件付きエクスポートの設定
- 02ESM/CJS 両形式のパッケージ構築
- 03TypeScript 宣言の設定
- 04npm パッケージ内容の事前確認
- 05provenance を伴う公開
活用シーン
- 01パッケージのエントリーポイントとサブパス設定
- 02モジュール解決問題の調査
- 03スコープ付き npm パッケージの公開
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ oakoss/ agent-skills --skill package-publishingインストール後、Claude Code で/package-publishingを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/build-and-publish.mddual-format.mdpackage-json-config.md詳細
パッケージの公開
概要
exports フィールドを使った package.json の設定、ESM/CJS 両形式のビルド、TypeScript 型宣言、来歴情報を含む安全な公開ワークフローなど、最新の npm パッケージ作成を扱います。
使用する場面: パッケージのエントリーポイントを設定する場合、条件付きエクスポートを設定する場合、両形式のパッケージをビルドする場合、スコープ付きパッケージを公開する場合、またはモジュール解決の問題をトラブルシューティングする場合。
使用しない場面: アプリケーションレベルのバンドル設定(Vite/webpack のアプリ設定)、モノレポのワークスペース管理(Turborepo/Nx)、プライベートレジストリの設定(Verdaccio/Artifactory)。
クイックリファレンス
| パターン | フィールド/コマンド | 主なポイント |
|---|---|---|
| エントリーポイント | package.json の exports | main/module を置き換え、内部実装をカプセル化します |
| CJS フォールバック | main | exports に対応していないレガシーな利用側向け |
| ESM エントリー | module | バンドラーの慣例であり、Node.js では使用されません |
| 型宣言 | exports の types 条件 | 各条件ブロックの先頭に記述する必要があります |
| サブパスのエクスポート | "./utils": { ... } | 明確な公開 API を提供し、深い階層のインポートをブロックします |
| 条件付きエクスポート | import/require 条件 | 利用側ごとに ESM と CJS を切り替えます |
| パッケージの種類 | "type": "module" | .js ファイルを ESM にします。CommonJS には .cjs を使用してください |
| 副作用 | "sideEffects": false | バンドラーでのツリーシェイキングを有効にします |
| ピア依存関係 | peerDependencies | 共有ランタイム依存関係(React、Vue など) |
| エンジンの制約 | "engines": { "node": ">=18" } | Node.js の最小バージョンを明記します |
| ファイルの許可リスト | "files": ["dist"] | npm に公開されるファイルを制御します |
| 公開前のチェック | "prepublishOnly": "npm run build" | 公開前にビルドが実行されるようにします |
| ドライラン | npm pack --dry-run | 公開前にパッケージの内容を確認します |
| 来歴情報 | --provenance フラグまたは信頼できる公開者 | 暗号技術によるビルド証明 |
| スコープ付き公開 | --access public | スコープ付きパッケージを初めて公開する際に必要です |
よくある間違い
| 間違い | 正しいパターン |
|---|---|
エクスポートでdefaultの後にtypesを配置する | typesはすべてのエクスポートブロックで最初の条件にする必要があります |
エクスポートに"./package.json"がない | ツールとの互換性のために"./package.json": "./package.json"を含めます |
importとrequireで異なるAPIを使用する | APIの表面は同じにします。ESMソースを記述し、CJSにトランスパイルします |
新しいパッケージでexportsを使わずにmainを使用する | 主なエントリーポイントの定義にはexportsを使用します |
.js形式のESM出力で"type": "module"を忘れる | "type": "module"を設定するか、.mjs拡張子を明示的に使用します |
src/やnode_modules/を公開する | "files"の許可リストを使ってdist/のみを含めます |
prepublishOnlyスクリプトがない | 古い成果物の公開を防ぐため、ビルド手順を追加します |
ライブラリでdefaultエクスポートを使用する | ツール間で一貫した動作を実現するため、名前付きエクスポートを優先します |
公開前にnpm packでテストしない | パッケージの内容とサイズを確認するため、必ずドライランを実行します |
フレームワークプラグインでpeerDependenciesを省略する | 共有するランタイム依存関係をピア依存関係として宣言します |
| プロベナンスなしで公開する | サプライチェーンの透明性を確保するため、プロベナンスを有効にします |
パッケージが"type": "module"のときにCJS用として.d.tsを使用する | CJSの型宣言には.d.ctsを、ESMには.d.tsまたは.d.mtsを使用します |
委任
- ビルドツールの設定:
Exploreエージェントを使ってtsup/unbuild/rollupの設定を調査します - 型解決のデバッグ:「Are the Types Wrong?」(
attw)とともにTaskエージェントを使います - 公開パイプラインのレビュー:
code-reviewerエージェントに委任します
参考資料
コメント
Markdown 対応