dependencies-audit について
プロジェクトの依存関係を監査・修正する、Dune アプリ審査資料を準備する開発者向けスキルです。バージョン、脆弱性、保守状況、サプライチェーンリスク、ライセンスを確認し、`review-packages.md` と未解決事項の要約を作成します。
主な機能
- 01依存関係の一覧化と npm メタデータの確認
- 02既知の脆弱性の確認と修正
- 03パッケージの健全性と非推奨状況の評価
- 04インストールスクリプトとサプライチェーンリスクの確認
- 05ライセンス確認と監査レポートの作成
活用シーン
- 01依存関係の脆弱性や古いバージョンの監査
- 02非推奨または保守状況の悪いパッケージの特定
- 03Dune アプリ審査向けの依存関係レポート作成
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ cognitedata/ dune-skills --skill dependencies-auditインストール後、Claude Code で/dependencies-auditを入力して読み込まれたか確認します。
詳細
依存関係の修正
$ARGUMENTS 内(引数が指定されていない場合はルートの package.json)にある依存関係の問題をすべて特定して修正します。対象は、脆弱性、古いパッケージ、非推奨の依存関係、ライセンスの問題、サプライチェーンのリスクです。このスキルでは、Dune アプリのレビュー手順で必要となる review-packages.md 成果物を生成します。
ステップ 1 — すべての依存関係を読み込み、一覧表示する
# List all dependencies and devDependencies
node -e "
const pkg = require('./package.json');
console.log('=== Dependencies ===');
Object.entries(pkg.dependencies || {}).forEach(([name, ver]) => console.log(name + ' @ ' + ver));
console.log('\\n=== Dev Dependencies ===');
Object.entries(pkg.devDependencies || {}).forEach(([name, ver]) => console.log(name + ' @ ' + ver));
"
dependencies と devDependencies の合計数を記録します。
ステップ 2 — npm のメタデータを確認し、古いパッケージを更新する
各パッケージについて、以下の情報を収集します。
- npm 上の最新バージョン
- 週間ダウンロード数
- 最終公開日
- 非推奨フラグ
# Batch lookup — run for each package (example for a single package)
npm view <package-name> --json 2>/dev/null | node -e "
const data = JSON.parse(require('fs').readFileSync('/dev/stdin','utf8'));
console.log(JSON.stringify({
name: data.name,
latest: data['dist-tags']?.latest,
modified: data.time?.modified,
deprecated: data.deprecated || false,
}));
"
# For weekly downloads, use the npm API
curl -s "https://api.npmjs.org/downloads/point/last-week/<package-name>" | node -e "
const data = JSON.parse(require('fs').readFileSync('/dev/stdin','utf8'));
console.log(data.downloads);
"
効率化のため、複数のパッケージをまとめて検索します。プロジェクトに多数の依存関係がある場合は、スクリプトを使用します。
node -e "
const { execSync } = require('child_process');
const pkg = require('./package.json');
const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
for (const [name, usedVersion] of Object.entries(allDeps)) {
try {
const info = JSON.parse(execSync('npm view ' + name + ' --json 2>/dev/null', { encoding: 'utf8' }));
const latest = info['dist-tags']?.latest || 'unknown';
const modified = info.time?.modified || 'unknown';
const deprecated = info.deprecated ? 'YES' : 'No';
console.log([name, usedVersion, latest, modified, deprecated].join(' | '));
} catch {
console.log(name + ' | ' + usedVersion + ' | LOOKUP FAILED');
}
}
"
修正:古いパッケージを更新する
メジャーバージョンが 1 つを超えて遅れている各パッケージを更新します。
pnpm update <package>@latest
マイナーバージョンが 1 つ以上遅れているパッケージは、最新のマイナーバージョンに更新します。
pnpm update <package>
更新後、pnpm install と pnpm run build を実行し、問題がないことを確認します。メジャーアップデートによってビルドが失敗した場合は、その更新を個別に元に戻し、手動修正項目として記録します。
ステップ 3 — セキュリティ監査を実行し、脆弱性を修正する
# Run audit with the project's package manager
pnpm audit --json 2>/dev/null || npm audit --json 2>/dev/null
# Also run production-only audit (what ships to users)
pnpm audit --prod --json 2>/dev/null || npm audit --production --json 2>/dev/null
JSON 出力を解析し、以下を確認します。
- 深刻度ごとの件数(critical、high、moderate、low)
- 脆弱性ごとの詳細(パッケージ、深刻度、タイトル、修正バージョン、アドバイザリー URL)
既知の CVE があるパッケージは、ヘルス列で自動的に Fail とします。
修正:脆弱性を解決する
pnpm audit fix を実行して、自動修正できる問題を修正します。自動修正できない high/critical の CVE が残っている場合は、package.json 内で脆弱なパッケージを修正済みバージョンに手動で更新し、pnpm install を実行します。修正済みバージョンに互換性を損なう変更がある場合は、適応に必要な最小限のコード変更を適用します。脆弱性が推移的依存関係にある場合は、package.json の pnpm overrides を使用して修正済みバージョンを強制します。
{
"pnpm": {
"overrides": {
"vulnerable-package": ">=2.1.0"
}
}
}
修正を適用した後、pnpm audit を再実行し、脆弱性が解決されたことを確認します。pnpm run build を実行し、問題がないことを確認します。
ステップ 4 — ヘルススコアを割り当て、Fail 判定のパッケージを修正する
各パッケージにヘルス指標を割り当てます。
| ヘルス | 基準 |
|---|---|
| Pass | 週間ダウンロード数が 10 万超、かつ過去 12 か月以内に更新されており、非推奨ではなく、バージョンが最新またはそれに近い(メジャーバージョンの差が 1 以内) |
| Warn | 週間ダウンロード数が 1 万〜10 万、または最終公開から 12 か月超、またはメジャーバージョンが 1 つを超えて遅れている |
| Fail | 週間ダウンロード数が 1 万未満、または 2 年以上更新されていない、または非推奨、または既知の CVE がある |
例外:
@cognite/*パッケージ:ダウンロード数が少なくても、Cognite 内部パッケージは信頼します。@types/*パッケージ:DefinitelyTyped のパッケージは信頼し、メインパッケージとバージョンが一致しているかを確認します。- 新しく公開されたパッケージ(公開から 6 か月未満):ダウンロード数が少なくても自動的に Fail とせず、レビュー対象として Warn を付けます。
修正:Fail 判定のパッケージを置き換える
Fail 判定となった各パッケージについて、以下を行います。
- 非推奨の場合: 推奨される代替パッケージを見つけてインストールします。コードベース全体のインポートを更新します。
- メンテナンスされていない場合(2 年以上): 同等の機能を持つ、積極的にメンテナンスされている代替パッケージを見つけて置き換えます。
- ダウンロード数が少なく、
@cognite/*ではない場合: 本当に必要かどうかを評価します。ネイティブの JS/TS による同等機能がある場合や、機能が単純な場合は、依存関係を削除してコード内に実装します。
置き換えるたびに pnpm install と pnpm run build を実行し、問題なく動作することを確認します。
ステップ 5 — サプライチェーンのリスクを確認し、軽減する
# Check for install scripts (preinstall, postinstall, prepare)
node -e "
const { execSync } = require('child_process');
const pkg = require('./package.json');
const allDeps = Object.keys({ ...pkg.dependencies, ...pkg.devDependencies });
for (const name of allDeps) {
try {
const info = JSON.parse(execSync('npm view ' + name + ' --json 2>/dev/null', { encoding: 'utf8' }));
const scripts = info.scripts || {};
const risky = ['preinstall', 'install', 'postinstall'].filter(s => scripts[s]);
if (risky.length > 0) {
console.log('INSTALL SCRIPT: ' + name + ' — ' + risky.join(', '));
}
} catch {}
}
"
# Check for packages with very few maintainers (single point of failure)
# This is informational, not blocking
修正:インストールスクリプトのリスクを評価し、軽減する
インストールスクリプトがある依存関係について、スクリプトが正当なものか(例:sharp、esbuild、better-sqlite3 のネイティブモジュールのコンパイル)を判断します。既知のビルドツールやネイティブモジュールのパッケージにインストールスクリプトがあるのは想定内です。
そのパッケージが既知のビルドツールではなく、インストールスクリプトに不審な点がある場合は、より安全な代替パッケージに置き換えます。置き換え後、pnpm install と pnpm run build を実行し、問題なく動作することを確認します。
ステップ 6 — ライセンスの互換性を確認し、問題のあるパッケージを置き換える
# List all licenses
npx license-checker --summary 2>/dev/null || node -e "
const { execSync } = require('child_process');
const pkg = require('./package.json');
const allDeps = Object.keys({ ...pkg.dependencies, ...pkg.devDependencies });
for (const name of allDeps) {
try {
const info = JSON.parse(execSync('npm view ' + name + ' --json 2>/dev/null', { encoding: 'utf8' }));
console.log(name + ': ' + (info.license || 'UNKNOWN'));
} catch {}
}
"
Dune アプリの商用配布で許容されるライセンス:
- MIT、Apache-2.0、BSD-2-Clause、BSD-3-Clause、ISC、0BSD、Unlicense、CC0-1.0
法務レビューが必要なライセンス:
- GPL-2.0、GPL-3.0、LGPL-2.1、LGPL-3.0、AGPL-3.0、MPL-2.0、EUPL-1.1
- 「UNKNOWN」またはライセンスが不明なもの
修正:問題のあるライセンスのパッケージを置き換える
production dependencies にコピーレフトライセンス(GPL、AGPL)または不明なライセンスのパッケージがある場合は、MIT/Apache-2.0 ライセンスの代替パッケージを探して置き換えます。コードベース全体のインポートをすべて更新してください。
コピーレフトライセンスの devDependencies はリスクは低いものの、認識しておくべき事項としてフラグを付けてください。
置き換えるたびに pnpm install と pnpm run build を実行して検証してください。
ステップ 7 — review-packages.md 成果物を生成する(修正後の状態)
すべての修正を適用した後に、メタデータの検索を再実行し、修正後の状態を記録します。その後、Dune アプリのレビュー手順で指定されている形式で出力を作成します。
## Package audit: [app name]
### Dependencies
| Package | Used version | Latest | Weekly downloads | Last published | Deprecated | CVEs | Health |
| ------- | ------------ | ------ | ---------------- | -------------- | ---------- | ---- | ------ |
| react | ^18.2.0 | 18.3.1 | 25M | 2024-04-26 | No | 0 | Pass |
| some-old-lib | ^1.0.0 | 1.0.3 | 5k | 2021-03-15 | No | 0 | Fail |
### Dev Dependencies
| Package | Used version | Latest | Weekly downloads | Last published | Deprecated | CVEs | Health |
| ------- | ------------ | ------ | ---------------- | -------------- | ---------- | ---- | ------ |
| vitest | ^1.6.0 | 2.0.1 | 8M | 2024-07-01 | No | 0 | Pass |
### Security audit
| Severity | Count |
| -------- | ----- |
| Critical | 0 |
| High | 0 |
| Moderate | 0 |
| Low | 0 |
#### Vulnerabilities
| Package | Severity | Title | Patched in | Advisory |
| ------- | -------- | ----- | ---------- | -------- |
| (none found) | — | — | — | — |
### License summary
| License | Count | Packages |
| ------- | ----- | -------- |
| MIT | 45 | react, react-dom, ... |
| Apache-2.0 | 3 | ... |
### Supply-chain flags
| Package | Risk | Details |
| ------- | ---- | ------- |
| (none found) | — | — |
ステップ 8 — 残っている問題を報告する
修正した内容と残っている内容を要約します。
修正済み
| カテゴリ | 件数 | 詳細 |
|---|---|---|
| 更新したパッケージ | N | パッケージ名とバージョン変更の一覧 |
| 解決した CVE | N | 修正した CVE の一覧 |
| 置き換えた非推奨の依存関係 | N | 古いパッケージ -> 新しいパッケージ |
| 解決したライセンスの問題 | N | 古いパッケージ -> 新しいパッケージ |
残っている問題(自動修正できなかったもの)
自動的に修正できなかった問題のみを記載します。
- 手動でのコード変更が必要な、メジャーアップデートによる破壊的変更
- 法務レビューが必要なライセンス(例:推移的依存関係にある LGPL)
- 保守されている代替パッケージがないパッケージ
- 修正バージョンがまだ提供されていない脆弱性
各項目について、自動修正できなかった理由と、アプリの作成者が行うべき対応を説明してください。
完了
全体的な健全性の評価として、修正後の Pass/Warn/Fail の件数、解決した問題の件数、アプリの作成者による手動対応が必要な残りの項目を報告します。