
AIコーディングアシスタント向けの自動依存関係セキュリティレイヤー。npm、PyPI、RubyGems、Maven、Go、Rustエコシステム全体で、パッケージのCVE、タイポスクワッティング、放置、バージョン経年問題、ハッシュ整合性を監査します。
Claude のような AI コーディングアシスタントは、プロジェクトにパッケージを追加するとき、既知のセキュリティ脆弱性があるかどうか、パッケージがまだ活発にメンテナンスされているかどうか、あるいはタイポ一つで悪意のある類似パッケージになり得る名前かどうかを確認せずに、それらしく聞こえるバージョンを選んでしまうことがよくあります。
safer-dependencies は Claude Code のセキュリティレイヤーです。Claude とマニフェストファイルの間に位置し、セキュリティチェックを自動的に実行します。脆弱性のあるインストールは実行前に拒否され、マニフェストに書き込まれたリスクのあるバージョンは、書き込み直後にディスク上で修正されます。npm、PyPI、RubyGems、Maven、Go、Rust、PHP(Composer)を対象に、CVE、タイポスクワッティング、放棄されたパッケージ、バージョンの経過期間の問題、さらに新規リリースのクールダウン期間など、リスクのある依存関係を検出・修正します。何が対象で何が対象外かについては、CAPABILITIES.md を参照してください。
はじめての方? GETTING-STARTED.md を読めば、ゼロから動作するインストールまで約5分で到達できます。
セキュリティとプライバシー: SECURITY.md(脆弱性の開示)、PRIVACY.md(データ外部送信、テレメトリなし)、CAPABILITIES.md(このツールが防御するものとしないもの)を参照してください。
ライセンス(ソース公開 — OSI の「オープンソース」ではありません): 自己目的での使用と修正は無料です。営利目的、社内利用、販売する製品の構築を含みます。ソフトウェア自体を収益化する場合(販売、販売される製品やサービスへの同梱、または有料での第三者への機能提供(ホスト型/SaaS/API を含む))にのみ、別途有料ライセンスが必要です。再配布および派生物はライセンスを保持し、このプロジェクトへのクレジットを明記しなければなりません。LICENSE(商用制限についてはセクション4)を参照してください。商用ライセンスのリクエストは github.com/robert-auger まで。
GETTING-STARTED.md を読めば、前提条件、対話式インストール、検証を含め、ゼロから動作するインストールまで約5分で到達できます。完全なインストールリファレンス(グローバル/プロジェクト/手動インストール、Windows 固有の注意点、権限許可リスト、更新、アンインストール)については、INSTALLATION.md を参照してください。
日常の使い方: フックがインストールされていれば、実行するものは何もありません。safer-dependencies はバックグラウンドで自動的に動作します。Claude がパッケージを追加またはインストールするとき、リスクのある依存関係をフラグし、脆弱性のあるバージョンをその場で安全なバージョンにアップグレードし、既知の脆弱性のあるインストールは実行前にブロックします。そのため、安全でないパッケージは、あなたが依頼しなくても検出・修正されます。いつでも直接呼び出すこともできます: "[email protected] は安全ですか?"、"safer-dependencies のセットアップを確認"、"safer-dependencies の統計を表示"。
Claude がプロジェクトにパッケージを追加しようとするとき、safer-dependencies はインターセプトして次の5つのチェックを実行します:
requirements.txt で --hash=sha256:... ピンが指定されている行について、宣言されたハッシュが PyPI の公開ハッシュと照合されます。不一致の場合は WARNING が発行されます。paperclip、request、pycrypto、github.com/dgrijalva/jwt-go)は、推奨される代替品とともに即座にハードブロックされます。2年以上安定版のリリースがないパッケージには、アドバイザリの STALE: 警告が発行されます。ハードブロックされたパッケージはマニフェストから削除され、Claude が対応方法を尋ねます。STALE のみのパッケージはそのまま残されます。問題が見つかった場合、Claude は警告を発し、より安全なバージョンに戻すことがあります。すべてのチェックは ~/.claude/safer-dependencies-audit-YYYY-MM.log に記録されます(暦月ごとに1ファイル)。
このスキルは5つのモードで動作します(以下に概要を示します。最も深い設計理論は skills/safer-dependencies.md にあります):
Claude が import を書こうとするとき、マニフェストにパッケージを追加しようとするとき、またはロックファイルを更新しようとするとき、スキルはセッション内でインライン実行されます:
バージョン選択は、スキルに同梱されたスタンドアロンの Python スクリプトによって処理され、LLM がルールを解釈するのではありません。コマンドは SELECTED: <version> を出力し、Claude はそのバージョンを正確に使用します。
.claude/settings.json に PostToolUse フックを設定すると、自動的かつ透過的なパッケージ検証が有効になります:
package.json)を書き込みます。ファイルはディスクに保存されますPostToolUse フックが発火し、safer-dependencies-shim.sh を呼び出しますhookSpecificOutput.additionalContext を介して stdout にシグナル(UPDATED:、BLOCKED:、WARNING:、STALE:、MAJOR-UPDATE-CONFIRM:、REFACTOR-REQUIRED:、REGRESSION:、TYPOSQUAT-CONFIRM:、VERIFY:、)を出力します。監査ログに同じ(ファイル、パッケージ)が以前に同じ安全なターゲットに修正されていたことが示されている場合、 は の前に出力されます。つまり、サブエージェントまたは古いプランが既知の脆弱性のあるバージョンを再導入したため、オーケストレーターはメジャーバンプを再判断するのではなく、以前に承認されたバージョンを復元する必要があります。設計メモ — Shape C(書き込み後修正): このフックは書き込みをブロックしません。脆弱性のある各バージョンはまずディスクに保存され、その後、同じツール使用サイクル内で自動修正されます。これは PreToolUse によるブロック設計に対する意図的な選択です。トレードオフについては FAQ.md を参照してください。
シグナル例:``` UPDATED: aiohttp 3.8.5 → 3.9.0 (HIGH: 33 CVEs fixed)
親エージェントは、これらのシグナルを使用して影響を受けるコードを特定し、必要に応じてリファクタリングします。
### 事前インストールモード(Bash フック)
`.claude/settings.json` に `PreToolUse:Bash` フックを設定して、
パッケージマネージャーのインストールコマンドの事前監査を有効にします。これは
インターセプトモードを補完するものであり(置き換えるものではありません)— 両者を組み合わせることで多層的な防御を構成します。
1. Claude が Bash ツール呼び出しを試みます(例: `npm install [email protected]`)
2. `PreToolUse` フックは呼び出しが実行される前に発火し、
`safer-dependencies-pretooluse-bash.sh` を呼び出します
3. 純粋な bash の初期フィルターが、パッケージマネージャー以外のコマンドを約115ミリ秒で短絡します
(Python を起動しません)。そのため、`git status` / `ls` / `npm test` は
ホットパス上で無視できるほどのコストしかかかりません
4. 認識されたパッケージマネージャーのインストール(`npm`/`pnpm`/`yarn` の
`install`/`i`/`add`)に対して、ヘルパーは `shlex` でトークン化し、各
`pkg@version` 引数を抽出して OSV に POST します
5. 脆弱性のある具象ピンが見つかった場合、フックは
`permissionDecision: "deny"` を返します。各検出結果には GHSA-ID + CVSS +
サマリーに加え、safer-dependencies スキルを呼び出すためのヒントが含まれます
6. インストールは実行されません — ネットワーク取得も postinstall スクリプトもありません
**なぜインターセプトモードに加えてこれが存在するのか:** post-write シム
は Bash を認識できません。`npm install [email protected]` は、監査が発火する前に
完了まで実行され(postinstall スクリプトも実行されます)。`npm install -g
typosquat-pkg` はプロジェクトマニフェストを一切書き込みません。事前インストールモード
は、これらのギャップを構造的に埋めます。
事前インストールモードは、ユーザーが**入力した**もの(コマンドライン上の
`pkg@version` 引数)しか認識できません。リゾルバーが実際にインストールする推移的依存ツリーは見えません。
**インストール後モード**(後述)は、インストール完了後にロックファイルを監査します — この2つのモードは補完的であり、冗長ではありません。
**対象範囲:** ここでカバーされるパッケージマネージャー CLI は、5つのエコシステムにわたります
(npm/pnpm/yarn/bun/npx/deno、pip/pip3/pipx/pipenv/uv/uvx/poetry、gem/bundle、
go、cargo)。さらに、インターセプトモード経由で Maven も対象です(Maven の依存関係は通常
`pom.xml`/`build.gradle` に宣言され、CLI 動詞で追加されることはありません)。
> **既知のギャップ:** Maven CLI は、以下による直接ダウンロードをサポートしています
> `mvn dependency:get -Dartifact=group:art:version` および `mvn dependency:copy`。
> このフックはまだこれらの呼び出しを認識しません。これらを
> 定期的に使用する場合、既存の post-write シムはマニフェストに書き込まれたものを
> 引き続き検出しますが、取得前保護は上記の
> エコシステムにのみ適用されます。フォローアップとして追跡されています。
認識されるエコシステム別の構文:
| PM | Verbs | Concrete-pin syntax |
|---|---|---|
| `npm`, `pnpm`, `yarn`, `bun` | `install`, `i`, `add`(`yarn`/`pnpm dlx`、`bun x`、`yarn create` も含む) | `[email protected]`, `@scope/[email protected]` |
| `npx` | (動詞なし — パッケージが最初の位置引数) | `[email protected]` |
| `deno` | `add`, `install` | `npm:[email protected]`(npm プレフィックス付きスペック) |
| `pip`, `pip3`, `pipx`, `pipenv`, `uv`, `uvx`, `poetry` | `install`(pip/pip3/pipx/pipenv)/ `add`(uv/poetry)/ 動詞なし(uvx) | `pkg==1.2.3`(extras の `pkg[extra]==X` も処理されます) |
| `gem`, `bundle` | `install` (gem) / `add` | `-v 1.2.3`, `--version 1.2.3`, `--version=1.2.3`(別フラグ) |
| `go` | `get`, `install` | `[email protected]`(Go モジュールの規則により `v` プレフィックスを含める必要があります) |
| `cargo` | `add`, `install` | `[email protected]` |
範囲ピン(npm の `^4.17`、pip の `>=`、poetry の `^`/`~`、Go の `@latest`)および
未指定バージョンは、インストール後にインターセプトモードへ渡されます —
post-write シムがリゾルバーの選択結果を監査します。安全なバージョンへの
自動書き換えはフォローアップとして予定されています。
**障害モード:** フェイルオープン。あらゆるエラー(Python の欠如、ネットワークの瞬断、
不正な入力)は出力なしで終了コード 0 を返し、bash の実行を継続させます。
インストール後もインターセプトモードが実行されるため、事前チェックの失敗は
既存の保護にグレースフルにフォールバックします。
**拒否の例:**```
safer-dependencies pre-flight audit blocked this install.
Vulnerable pinned version(s) detected:
- [email protected] → GHSA-35jh-r3h4-6jhm (CVSS:7.4): Command Injection in lodash
Re-run with a patched version, or invoke the safer-dependencies skill
for a recommended pin.
.claude/settings.json に PostToolUse:Bash フックを設定すると、Bash
コマンド実行後の監査が有効になります。コマンドの cwd に対して
3 つの独立したスキャンを実行し、それぞれが他のフックでは
カバーできないギャップを埋めます:
npm install、
bundle install、poetry install、uv sync、go mod tidy など)が成功した
後、直近で変更されたロックファイル(package-lock.json、Gemfile.lock、
poetry.lock、uv.lock、go.sum、yarn.lock、pnpm-lock.yaml、
Pipfile.lock)を監査します。これにより、Pre-Install では見えない
推移的 CVE のギャップを埋めます。ユーザーは pkg@version と入力しましたが、
リゾルバーは誰も名指ししていない多数の推移的依存パッケージを
引き込んでいる可能性があります。スキャンの実行手順:
PostToolUse フックはコマンド完了後に発火し、
safer-dependencies-posttooluse-bash.sh を呼び出すls / git / cat のコストは無視できる程度です。find -maxdepth 5 で cwd を走査し(モノレポ構成に対応。
node_modules、.git、.venv、venv は除外)、直近 60 秒以内に変更された
ファイルを探す — SAFE_DEP_POSTINSTALL_MTIME_WINDOW で上書き可能PostToolUse:Write ペイロードを生成し、既存のシムにパイプする — シムの
ロックファイル監査とマニフェスト監査は変更なしで実行され、ロジックの重複はないPre-Install では検出できないもの: 推移的脆弱性です。一見問題のない
bundle install が sinatra の推移的依存として [email protected]
(CVE-2025-27610)を引き込む可能性があります。ユーザーは rack と入力して
いないため Pre-Install では検出できませんが、Post-Install は解決済みの
Gemfile.lock を読み取って CVE を報告します。
スコープ: Scan A は解決済みバージョンを書き換えません。自動修正の契約は、
Claude が直接書き込んだマニフェストにのみ適用されます。推移的 CVE の場合、
修正は通常「推移的依存を所有する直接依存を更新する」ことになり、人間の判断が
必要です。Scan B は Intercept Mode と同じシム経路でマニフェストを監査するため、
自動修正を行います。transitive チェックレベルが off に設定されている場合
(config set checks.transitive off)、Scan A はスキップされます。
障害モード: 他のフックと同様、フェイルオープンです。エラー(シムの欠落、 ペイロードの不正、Python が利用不可など)はすべて静かに終了コード 0 で 終了します。
WARNING の例:``` WARNING: [email protected] in lock file has GHSA-29mw-wpgm-hmr9, GHSA-35jh-r3h4-6jhm
### Post-Agentモード(エージェントフックペア)
上記の4つのモードは、**ルートセッション**のツール呼び出しでのみ発動します。ルートセッションがサブエージェントを(`Agent` ツール経由で、多くのスキルやスラッシュコマンドが内部でこれを行います)ディスパッチすると、サブエージェントのWrite/Edit/Bash呼び出しはこれらすべてをバイパスします。Post-Agentモードは、そのギャップに対するリアクティブなセーフティネットです。
1. `PreToolUse:Agent` フック(`safer-dependencies-pretooluse-agent.sh`)は、各Agentディスパッチの直前に実行され、`/tmp/.safer-deps-agent-<PPID>-<session_id>.sentinel` のセンチネルファイルをタッチします(セッションIDがない場合はPPIDのみの名前にフォールバックします)。
2. サブエージェントが実行され、マニフェストやロックファイルを書き込むことがあります。
3. `PostToolUse:Agent` フック(`safer-dependencies-posttooluse-agent.sh`)は、Agent呼び出しが戻った後に実行され、センチネルより新しいすべてのマニフェストとロックファイルを `find` し、同じシムパスを介してそれぞれを監査します。
4. 検出結果は `additionalContext` としてルートセッションの次のターンに表示されます。センチネルは削除されます。
ネストされたサブエージェントは自動的にカバーされます。ルートの `PostToolUse:Agent` は、外側のエージェントのすべての作業(*それ*がディスパッチしたものを含む)がディスクに書き込まれた後にのみ発動します。唯一のギャップは、マニフェストやロックファイルを書き込まないグローバルインストール(`npm install -g …`)です。スキャンするものがありません。他のフックと同様に、フェイルオープンです。エラー(センチネル欠落、シム欠落、ペイロード読み取り不能)はすべて静かに終了コード0で抜けます。設計根拠の全容は `skills/safer-dependencies.md` にあります。
## 発動条件
このスキルは、Claudeが以下を行う場合に自動的に発動します:
**マニフェスト / インストール操作**
- `package.json`、`requirements.txt`、`Gemfile`、`pom.xml`、`build.gradle`、`Cargo.toml`、`go.mod`、またはその他のサポート対象マニフェストでパッケージを追加・更新する
- マニフェストでまだ宣言されていないパッケージの `import`、`require`、`use` を記述する
- ロックファイルを生成または更新する(新規・変更エントリのみチェック)
- Bashでパッケージマネージャのインストールを実行する(`npm install`、`bundle install`、`poetry install`、`uv sync`、`go mod tidy` など)— Pre-Installはコマンド引数を監査し、Post-Installは生成されたロックファイルを監査します
- 固定されたパッケージマネージャのインストール手順を埋め込んだ `Dockerfile` やCIワークフロー(`.github/workflows/*.yml` など)を記述する
**選択・推奨の質問**
- ライブラリ/フレームワークの比較: "axiosを使うべきかnode-fetchを使うべきか?"、"moment vs dayjs?"、"XとYはどちらが良いか?"
- 推奨リクエスト: "Python用の良いHTTPクライアントは?"、"Go用のロギングライブラリを勧めて"、"NodeでCSVを扱うパッケージは?"
- バージョン選択: "Djangoのどのバージョンを使うべきか?"、"最新の安定版Flaskは?"
**使用意図の表明(追加前)**
- "これにFastAPIを使いたい"、"Celeryを追加しようと考えている"、"ORMとしてPrismaを検討している"、"Tailwindを使おう"
**パッケージの健全性・信頼性の質問**
- "moment.jsはまだメンテナンスされているか?"、"このgemはまだアクティブか?"、"Xは放棄されたか?"、"XはEOLか?"、"このパッケージを信頼できるか?"、"fakerが最後に更新されたのはいつか?"
**スキャフォールディングコマンド**
- `npx create-react-app`、`npm create vite@latest`、`django-admin startproject`、`rails new`、`cargo new` + `cargo add`、"新しいFastAPIプロジェクトを立ち上げる"
**暗黙のパッケージ追加(新しい依存関係を暗示する機能リクエスト)**
- "アプリにRedisキャッシュを追加する"、"Postgresに接続する"、"JWT認証を追加する"、"メールを送信するコードを書く" — その機能に対応するパッケージがまだマニフェストにない場合に発動します
**移行・移植**
- "requestsからhttpxに移行する"、"CRAからViteに移行する"、"momentからdate-fnsに移植する" — 受け入れるパッケージを監査します
次の場合には**発動しません**:
- 標準ライブラリのインポート(`os`、`fs`、`java.util.*` など)
- 変更されていない、既に宣言済みの依存関係
- パッケージが内部でどのように動作するかについての学術的な議論("Reactのレコンサイラーを説明して"、"webpackのモジュール解決はどのように動作するのか?")— 比較・選択の質問では発動します
- OSレベルのアプリ、ランタイム、IDE拡張機能のインストール(Python自体、Docker、Homebrew、VS Code拡張機能)
## このリポジトリの内容
これは**スキル+フックバンドル**であり、単一のスキルファイルではありません。完全なインストールでは以下の部品を配置します:
| File | Role |
|---|---|
| `skills/safer-dependencies.md` | **スキル**(`SKILL.md` インストール後)。監査手順を説明し、インストール/統計用の管理モードを含みます。 |
| `skills/safer-dependencies-shim.sh` | `PostToolUse:Write`/`Edit` フック — マニフェスト+ロックファイルの書き込みを監査し、脆弱なバージョンをその場で自動修正します(Intercept Mode)。 |
| `skills/safer-dependencies-pretooluse-bash.sh` | `PreToolUse:Bash` フック — パッケージマネージャのインストールコマンドの事前OSV監査。インストール実行前に脆弱なバージョン固定(pin)を拒否します(Pre-Install Mode)。 |
| `skills/safer-dependencies-posttooluse-bash.sh` | `PostToolUse:Bash` フック — Bashコマンド実行後の事後監査。新しく書き込まれたロックファイル、`sed`/`jq`/スクリプトで編集されたマニフェスト、および素の`pip install`の解決済み環境における推移的CVEを検出します(Post-Install Mode)。 |
| `skills/safer-dependencies-pretooluse-agent.sh` + `skills/safer-dependencies-posttooluse-agent.sh` | `PreToolUse:Agent` + `PostToolUse:Agent` フックペア — サブエージェントのカバレッジギャップを埋めます。モード2–4はルートセッションのツール呼び出しでのみ発動するため、サブエージェントが書き込んだマニフェストはこれらをバイパスします。Post-Agentは各Agentツール呼び出しが戻った後にサブエージェントが書き込んだ内容を監査します(Post-Agent Mode)。 |
| `skills/scripts/` | 全フックで使用される共有Pythonライブラリ(`safedep/`)とスタンドアロンのリゾルバスクリプト。 |
| `skills/scripts/safer_dependencies_manager.py` | 対話型インストール、使用統計、セットアップ検証のための管理モジュール。 |
スキルファイルだけでは不十分です。フックがなければ、自動呼び出しはClaudeがスキルを使おうと判断するかどうかに依存します。完全なカバレッジのためには5つの部品すべてをインストールしてください。多くのスキルやスラッシュコマンドは内部でサブエージェントをディスパッチするため、明示的にサブエージェントを生成しなくてもPost-Agentペアは重要です。(スキル単体ではカバレッジを保証できない理由については、[FAQ.md](https://github.com/robert-auger/safer-dependencies/blob/HEAD/FAQ.md#why-a-skill-alone-is-not-sufficient) を参照してください。)
## サポート対象エコシステム
| エコシステム | マニフェスト | ロックファイル |
|-----------|----------|-----------|
| npm | `package.json` | `package-lock.json`, `yarn.lock`, `pnpm-lock.yaml` |
| PyPI | `requirements.txt`, `pyproject.toml`, `Pipfile`, `setup.py`, `setup.cfg` | `Pipfile.lock`, `poetry.lock`, `uv.lock` |
| RubyGems | `Gemfile`, `*.gemspec` | `Gemfile.lock` |
| Maven | `pom.xml`, `build.gradle`, `libs.versions.toml` | -- |
| Go | `go.mod` | `go.sum` |
| Rust | `Cargo.toml` | `Cargo.lock` |
| PHP (Composer) | `composer.json` | `composer.lock` |
## インストール
このプロジェクトが初めてですか? **[GETTING-STARTED.md](https://github.com/robert-auger/safer-dependencies/blob/HEAD/GETTING-STARTED.md)** から始めてください。簡単な手順は次のとおりです:```bash
git clone https://github.com/robert-auger/safer-dependencies /tmp/safer-dependencies
python3 /tmp/safer-dependencies/skills/scripts/safer_dependencies_manager.py interactive_install
インストーラーはスコープ(グローバル vs プロジェクト)と有効にするフックを確認し、settings.json を自動で書き込みます — フックエントリ と、スキルのチェックコマンドが監査のたびに承認プロンプトなしで実行できるようにする権限許可リストの両方です。
インストール関連のその他すべては INSTALLATION.md に記載されています。これはインストールの仕組みに関する唯一のリファレンスです: 手動でのファイル単位インストール(グローバルおよびプロジェクトレベル)、Windows 固有の事項、Post-Agent フック、権限許可リスト、セットアップの検証、アップデート、リリースタグへの固定、アンインストール。
インストール後は、日常の管理は Claude への自然言語で行います — install safer-dependencies(再実行 / フックの変更)、show safer-dependencies stats、check safer-dependencies setup — または /safer-dependencies メニューを使用します。アップデートもセッション内で行います: /safer-dependencies update で最新リリースを適用します(update --check でドライラン、update --rollback で元に戻す)。信頼モデルについては INSTALLATION.md を参照してください。
プラットフォームに関する注意: macOS、Linux、Windows がサポートされています。Windows には Git for Windows(bash を提供)と
PATH上の Python 3 が必要です — WSL は不要です。これまでの実機テストは macOS と Windows に重点を置いています。Linux サポートは自動化された CI マトリクスで検証されています。
インストール後に設定できる項目は2つあります:
npm audit / bundle audit ルールとスキル自身のリゾルバースクリプト)を事前承認し、監査が毎回承認プロンプトなしで実行されるようにします。curl は決して事前承認されず、npm view / pip-audit は Convenience プロファイル経由でオプトインとなります。対話型インストーラーがコアエントリを自動で書き込みます。手動インストールでは完全なブロックを手作業で追加します。完全なブロックと根拠: INSTALLATION.md → 権限許可リスト。off/warn/block 階層。/safer-dependencies config で編集し、~/.config/safer-dependencies/config.toml に保存されます。スキーマと階層の意味論: skills/references/configuration.md。すべてのチェックは ~/.claude/safer-dependencies-audit-YYYY-MM.log に単一の JSON 行として記録されます(暦月ごとに1ファイル。YYYY-MM は UTC の年-月)。SAFE_DEP_AUDIT_LOG 環境変数で完全なパスを上書きできます(設定時、日付サフィックスは付加されません)。ファイルは SAFE_DEP_LOG_MAX_BYTES(デフォルト 10 MiB、0 で無効化)を超えるとサイズローテーションされます。SAFE_DEP_MODEL を設定すると、各エントリの source.model に書き込まれるモデル値を上書きできます — モデルバージョン間の A/B 比較に便利です。
5つのモードすべてが同じファイルに追記されます。各エントリには、どのコンポーネントが書き込んだかを示す source ブロック(スキーマ 2.2)が含まれます:
source.model はセッションでアクティブな Claude Code モデルを記録します(例: "claude-sonnet-4-6")。スキーマ 2.1 以降で使用可能です。旧インストールで書き込まれたエントリにはこのフィールドがありません。stats コマンドは、これがない場合は "unknown" に正常にフォールバックします。
jq で source.component によってフィルタリング:```bash
jq -r '.source.component' audit.log | sort | uniq -c | sort -rn
jq -c 'select(.source.component == "bash.pretooluse")' audit.log
jq -c 'select(.source.mode == "fail_open") | {component: .source.component, reason: .fail_open.reason, ts}' audit.log
分析を容易にするには、ログを手動で解析する代わりに、Claudeに使用統計を尋ねてください:```
"Show safer-dependencies stats for the last month"
これは、これらの監査ログから抽出されたアクティビティ、セキュリティへの影響、パフォーマンス指標の人間可読な要約を提供します。
エントリの形状(スキーマ 2.2)。 3つの異なる形状が同じ ts / schema / source ヘッダーを共有します:
監査エントリ: Intercept Mode は完全なパイプライン(来歴、バージョン経過期間、OSV、abandoned/stale、typosquat、signatures)を実行するため、すべての配列に値が設定されます。Pre-Install Mode は現時点では OSV のみを実行するため、abandoned / stale / typosquat / signatures は常に空になります。Post-Install ディスパッチ(ロックファイル監査)は shim.posttooluse 配下に書き込まれ、findings にはロックファイル監査ツールからの WARNING: 文字列が設定されます。notes 配列には情報提供用の NOTE: シグナル(例:manifest-skipped-because-unpinned)が格納されます。
スキーマ 2.2 では — 追加的に — ロックファイル監査エントリに 4 つのフィールドが追加されました: lockfile、manifest_ref、relation_summary(フラグが付けられた各パッケージの、兄弟マニフェストに対する直接/推移的/不明の分類)、および有効な transitive 階層を記録する policy ブロックです。このバンプは後方互換性があります:2.1 エントリのリーダーは新しいフィールドを許容し、source.model フィールドは 2.1 以降も引き続き存在します。```json
{
"ts": "2026-04-19T12:34:56Z",
"schema": "2.2",
"source": {
"component": "shim.posttooluse",
"script": "shim.sh",
"hook": "PostToolUse:Write",
"tool": "Write",
"mode": "intercept",
"model": "claude-sonnet-4-6"
},
"file": "/path/to/project/package.json",
"ecosystem": "npm",
"checked": ["[email protected]", "[email protected]"],
"findings": ["UPDATED: express 4.18.2 → 4.22.1 (HIGH: 1 CVE fixed)"],
"abandoned": [],
"stale": [],
"typosquat": [],
"unknown": [],
"signatures": [],
"notes": [],
"clean": ["[email protected]"]
}
プリインストールモードの例 (Bashフック、脆弱なピンは拒否):```json
{
"ts": "2026-04-23T06:56:21Z",
"schema": "2.2",
"source": {
"component": "bash.pretooluse",
"script": "pretooluse-bash.sh",
"hook": "PreToolUse:Bash",
"tool": "Bash",
"mode": "intercept",
"model": "claude-sonnet-4-6"
},
"file": "bash:npm install [email protected] [email protected]",
"ecosystem": "npm",
"checked": ["[email protected]", "[email protected]"],
"findings": [
"BLOCKED: [email protected] GHSA-35jh-r3h4-6jhm (CVSS:3.1/...): Command Injection in lodash"
],
"abandoned": [],
"stale": [],
"typosquat": [],
"unknown": [],
"signatures": [],
"notes": [],
"clean": ["[email protected]"]
}
フェイルオープンモードの例(Post-Install Bashフックが隣接するshimなしで呼び出される — 壊れたインストール):```json { "ts": "2026-05-03T07:14:11Z", "schema": "2.2", "source": { "component": "bash.posttooluse", "script": "safer-dependencies-posttooluse-bash.sh", "hook": "PostToolUse", "tool": "Bash", "mode": "fail_open", "model": "claude-sonnet-4-6" }, "fail_open": { "reason": "shim_missing", "detail": "/home/alice/.claude/skills/safer-dependencies" } }
フェイルオープンのエントリは、「前提となる何かが欠けていたため、このフックは起動したものの監査を行わずに早期終了した」ことを示します。上記の jq フィルター (`select(.source.mode == "fail_open")`) を使用して、ログ内のサイレントな保護喪失イベントをすべて浮き彫りにしてください。
シムがドライラン モード (`SAFE_DEP_DRY_RUN=1`) で実行されると、エントリには `"mode": "dry_run"` も含まれるため、事後分析で監査専用の呼び出しをフィルタリングできます。
## 要件
- Python 3.9+ (フックはこれを検査し、古いインタープリターではフェイルオープンします)
- `curl` (レジストリ API 呼び出しと OSV 脆弱性チェック用)
- エコシステムツール (任意。欠けている場合、スキルは OSV API にフォールバックします):
- `npm` (npm パッケージ用)
- `pip-audit` (Python パッケージ用)
- `bundle` (Ruby パッケージ用)
- `dependency-check` (Java パッケージ用)
## FAQ
設計判断の根拠 (`PreToolUse` ではなく `PostToolUse` を選んだ理由、署名を検証しない理由、スクリプトとシムを重複させている理由、スキル読み込みの落とし穴など) は [`FAQ.md`](https://github.com/robert-auger/safer-dependencies/blob/HEAD/FAQ.md) に文書化されています。
CLEAN:REGRESSION:MAJOR-UPDATE-CONFIRM:ls、cat、
git status、…)に含まれない Bash コマンドの実行後に、直近で変更された
マニフェストを監査します。これは、sed -i、jq、またはスクリプトによる
マニフェスト編集に対する唯一のフォールバックです。これらの編集は、
Intercept Mode がフックする Write/Edit ツールを迂回するためです。pip install /
pip install -r requirements.txt はロックファイルを書き出さないため、
Scan A は解決済みツリーを一切確認できません。pip 形式のインストール後、
Scan C は同じ pip を読み取り専用の list --format=json で再実行し、
解決済み環境全体(直接 + 推移的)を OSV チェックします。hookSpecificOutput JSON として
親エージェントに出力する| レベル |
|---|
| 意味 |
|---|
| 例 |
|---|
| CRITICAL | 停止してユーザーに確認 | タイポスクワッティング検出、改ざんされた署名 |
| HIGH | 警告して続行 | 既知の CVE、パッケージ作成から30日未満 |
| MEDIUM | 警告して続行 | バージョン作成から7日未満、署名なし |
| LOW | 警告して続行 | 署名なしの Ruby gem(想定内) |
source.component | 書き込み元 | トリガー |
|---|
shim.posttooluse | shim.sh | マニフェストまたはロックファイルの書き込み(Intercept モード、Post-Install ディスパッチ) |
shim.install_error | shim.sh | Shim のプレフライトインストール失敗 |
bash.pretooluse | pretooluse-bash.sh | Bash インストールコマンド(Pre-Install モード) |
bash.posttooluse | posttooluse-bash.sh | shim に到達する前にフェイルオープンした場合の Post-Install Bash フック自体 |
agent.pretooluse | pretooluse-agent.sh | Pre-Agent のフェイルオープンイベント用に予約(フック自体は現在、成功時はサイレント) |
agent.posttooluse | posttooluse-agent.sh | Post-Agent フックのフェイルオープンイベント(例: shim 欠落、python_missing) |
manual.skill | Normal モードで実行中の Claude | インラインで呼び出された手動監査 |
| 形状 | 書き込まれるタイミング | 識別フィールド |
|---|
| 監査エントリ | マニフェスト / ロックファイル / bash-install 監査 | file, ecosystem, checked, findings, abandoned, stale, typosquat, unknown, signatures, notes, clean |
| インストールエラーエントリ | Shim 事前チェックのインストールエラー(コンポーネント shim.install_error) | install_error, shim_dir, scripts_dir |
| フェイルオープンエントリ | フックのエントリポイントが helper_missing / shim_missing / python_missing により早期に終了する場合。source.mode は "fail_open" になる | fail_open: { reason, detail? } |