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

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

エージェントに任せた作業で依存が増えるとき、インストールの瞬間に走るライフサイクルスクリプトは誰も見ていません。既定を止め、検疫スコアで通す実装と運用をまとめます。

Antigravity332npm5サプライチェーン2postinstall無人運用6

プレミアム記事

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

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

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

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

npm install が実行しているもの

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

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

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

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

既定を反転する

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

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

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

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

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

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

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

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

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

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

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

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

この記事の続きを読む

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

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

この記事を購入する

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

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

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

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

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

関連記事

アプリ開発2026-07-14
AdMob を載せた画面のスクリーンショットテストを、広告の非決定性から守る
広告つきの画面はスクリーンショットテストが毎回赤くなり、やがて誰も差分を見なくなります。AdMob バナーの非決定性を封じ、レイアウトの崩れだけを検知に残す設計を、Compose の実装例と Antigravity での差分トリアージまで含めてまとめます。
アプリ開発2026-07-14
デプロイは成功なのに、ユーザーには古いビルドが出ていたとき — 出荷したコミットがエッジに届いたかを検証するゲートの運用メモ
デプロイが成功と表示されたのに本番が古いビルドを配り続けていたとき、出荷したコミットが実際にエッジへ届いたかをビルド印で検証するゲートの作り方を、運用ログの実測とともに整理します。
アプリ開発2026-07-10
エージェントの書いたORMコードでp95が5倍に — クエリ回数をテストで測り、CIで止める
N+1クエリはレビューの目をすり抜けます。クエリ回数を測定可能な値に変え、入力件数に対する傾きで判定するCIゲートの実装を、動くコードと実測値とともにまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →