◉ANTIGRAVITY LABEN
記事一覧/アプリ開発
▣ アプリ開発/2026-07-15上級

エージェントが足した依存を、インストール前に検疫する — postinstall を既定で止めて通す設計

npm install の postinstall を既定で止め、エージェントが足した依存をインストール前に検疫する設計です。スクリプトを持つ依存の棚卸し、新規依存への検疫スコア付け、無人ランへの差し込みを実装し、導入後1ヶ月の運用も振り返ります。

Antigravity386npm5サプライチェーンpostinstall無人運用7

✦ プレミアム記事

夜のうちにエージェントへ振っておいたタスクが、朝には終わっていました。テストも通っています。差分を眺めていて、package.json に一行増えているのに気づきました。CLI の引数を解釈する小さなライブラリです。週次ダウンロードは四桁、公開は11日前。

動作としては何の問題もありません。ただ、その依存が node_modules に展開されるとき、私の手元では postinstall スクリプトが一度実行されています。エージェントは「テストを通す」という仕事を果たしただけで、そのスクリプトの中身を検分する仕事は誰にも割り当てられていませんでした。

個人開発で複数のアプリと Stripe 課金を載せたサイト群を並行して回していると、依存を足す判断の回数だけが静かに増えていきます。同じ手元から App Store に出す成果物もビルドされます。だからこそ、この一行が気になりました。

npm install の一行は、コードの取得ではなく、コードの実行を含みます。手で依存を足していた頃は、その一行を打つ前に名前を検索するくらいの間がありました。エージェントに任せると、その間が消えます。

npm install が実行しているもの

npm のライフサイクルスクリプトのうち、依存パッケージ側で走りうるのは preinstall / install / postinstall の三つです。重要なのは、これが直接依存だけの話ではないという点です。深い階層の推移的依存が持つスクリプトも、同じ権限で、同じ実行ユーザーで走ります。

つまり手元で守るべき境界は「私が選んだパッケージ」ではなく「私が選んだパッケージが引き連れてきたツリー全体」です。エージェントに依存追加を任せると、この境界は一晩で広がります。

フック走るタイミング典型的な正当用途
preinstallそのパッケージの展開前環境チェック(ほぼ不要)
install展開直後ネイティブアドオンのビルド
postinstallinstall の後バイナリのダウンロード、パッチ適用

正当な用途は確かにあります。ネイティブアドオンや、プラットフォーム別バイナリを取得するツールは、これがないと動きません。ですから「全部禁止」は運用として続きません。続くのは「既定で止めて、必要なものだけ名指しで通す」という形です。

既定を反転する

パッケージマネージャによって、既定値と設定の場所が違います。手元の4つのリポジトリを揃えたときの実際の設定を並べます。

ツール依存スクリプトの既定止める / 通す方法
npm実行する.npmrc に ignore-scripts=true。通すものは個別に手で実行
pnpm (v10 以降)実行しないpackage.json の pnpm.onlyBuiltDependencies に列挙したものだけ実行
Yarn (Berry)実行しない.yarnrc.yml の enableScripts / dependenciesMeta

pnpm を使っているなら、既定が既に安全側です。allowlist を明示するだけで済みます。

{
  "pnpm": {
    "onlyBuiltDependencies": ["esbuild", "sharp", "@swc/core"]
  }
}

npm 側は既定を反転させます。

# .npmrc(リポジトリ直下・コミットする)
ignore-scripts=true

ここで素直に困るのが、ignore-scripts=true にすると壊れるパッケージがある点です。sharp や esbuild のようにバイナリを取りに行くものは、そのままでは実行時に落ちます。

注意点は、落ち方が分かりにくいことです。インストールは成功します。エラーは出ません。そしてアプリを起動した瞬間に「バイナリが見つからない」と言われます。本番運用のビルドで初めて気づく形になりやすく、私はこの静かな失敗の仕方をいちばん警戒しています。

そこで順序を逆にします。壊れてから探すのではなく、止まるものを先に数えます。私が4リポジトリで踏んだ手順はこの三つでした。

  1. スクリプトを持つ依存をツリー全体から棚卸しする(実装1)
  2. その一覧を allowlist と「落とす候補」に仕分ける
  3. 既定を反転し、allowlist だけを通す

この順で進めると、壊れる範囲が作業前に分かります。逆順で進めた最初の一回は、原因の切り分けだけで半日を費やしました。

✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦インストール時スクリプトを既定で止め、必要なものだけ通す .npmrc / pnpm 設定と、それで壊れるパッケージの見分け方
✦公開からの日数・週次ダウンロード・名前の編集距離・スクリプト有無から検疫スコアを出す動く実装
✦無人ランに組み込むゲートと、導入後1ヶ月の実測(自動通過 87%・要確認 13%・誤検知の内訳)
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Antigravity Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

▣ アプリ開発2026-10-15
immutable を付けた資産を同じ URL で差し替えたら、利用者のブラウザだけが古いままでした
長期キャッシュを付けた JS を同じ URL で差し替えても、CDN をパージしてもブラウザは取り直しません。同じ URL・no-cache・クエリ付き・内容ハッシュ名の 4 方式を Chromium で並べて比べ、ビルドの最後にハッシュを付ける完全なスクリプトまでをまとめました。
▣ アプリ開発2026-09-29
Cloudflare をパージしても古い壁紙が届き続けた原因は、オリジン側で JPEG を握っていた XPageSpeed
同じ URL に上書きした壁紙画像が、Cloudflare をパージしても古いまま届き続けた運用の記録です。ローカル・オリジン・エッジの三者を突き合わせて層を名指しする検査、プレフィックスパージの使いどころ、Xserver の XPageSpeed を .htaccess で安全に切る書き方まで扱います。
▣ アプリ開発2026-09-19
見積書 PDF の自動化を一度にまとめて頼み、4 つに割り直すまで
受託の見積書を毎回コピーして作っていた手作業を、Antigravity に頼んで小さな PDF 出力ツールへ移した記録です。最初に全部をまとめて頼んで作り直すことになった理由と、データ・計算・見た目・保存の 4 つに割って渡し直した順番を、動くコードと一緒に書き残します。