mcpField
D
dependency-audit

dependency-audit

github.com/bobmatnyc開発78427 回インストール15 週間前に更新
リポジトリ

dependency-audit について

プロジェクトの依存関係を監査、更新、整理するワークフロースキルです。脆弱性、古い・未使用のパッケージ、オープンソースのリスクを評価し、変更後のテストも案内します。

主な機能

  1. 01古いパッケージの確認
  2. 02セキュリティ脆弱性のスキャン
  3. 03未使用依存関係の検出
  4. 04非推奨ライブラリの移行案内
  5. 05ライセンスと陳腐化リスクの確認
  6. 06更新後のテスト手順

活用シーン

  1. 01定期的な依存関係の保守
  2. 02CVE アドバイザリへの対応
  3. 03リリース前の依存関係確認
  4. 04コードレビューでの依存変更の確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/bobmatnyc/claude-mpm-skills --skill dependency-audit

インストール後、Claude Code で/dependency-auditを入力して読み込まれたか確認します。

同梱ファイルmetadata.jsonreferences/open-source-safety.md

詳細

依存関係の監査スキル

概要

プロジェクトの依存関係を監査、更新、整理するための体系的なワークフローです。セキュリティ脆弱性のスキャン、古いパッケージの検出、未使用の依存関係の削除、非推奨ライブラリからの移行を対象とします。

使用するタイミング

  • 週次/月次の依存関係メンテナンス
  • セキュリティ勧告(CVE の発表)後
  • メジャーリリース前
  • バンドルサイズが予期せず増加したとき
  • 依存関係の変更に関するコードレビュー中
  • レガシープロジェクトへの参加時

クイック監査プロセス

1. 古いパッケージを確認する
# npm
npm outdated

# pnpm
pnpm outdated

# yarn
yarn outdated

# pip (Python)
pip list --outdated

# poetry (Python)
poetry show --outdated
2. セキュリティ脆弱性をスキャンする
# npm
npm audit
npm audit fix          # Auto-fix where possible
npm audit fix --force  # Force major version updates (risky)

# pnpm
pnpm audit
pnpm audit --fix

# yarn
yarn audit
yarn audit --fix

# Python
pip-audit              # Requires: pip install pip-audit
safety check           # Requires: pip install safety
3. 未使用の依存関係を見つける
# JavaScript/TypeScript
npx depcheck

# Output example:
# Unused dependencies
# * lodash
# * moment
# Unused devDependencies
# * @types/old-package

# Python
pip-autoremove --list  # Requires: pip install pip-autoremove

監査コマンド

JavaScript/TypeScript/Node.js
npm
# Check what's outdated
npm outdated

# Update within semver range (safe)
npm update

# Update specific package to latest
npm install package@latest

# Check security vulnerabilities
npm audit

# Auto-fix vulnerabilities
npm audit fix

# View dependency tree
npm list
npm list --depth=0  # Top-level only

# Why is this package installed?
npm ls package-name

# Check for duplicate packages
npm dedupe
pnpm
# Check outdated
pnpm outdated

# Update all dependencies
pnpm update

# Update specific package
pnpm update package@latest

# Security audit
pnpm audit

# Deduplicate
pnpm dedupe

# List all packages
pnpm list
yarn
# Check outdated
yarn outdated

# Upgrade interactive (recommended)
yarn upgrade-interactive

# Update all
yarn upgrade

# Security audit
yarn audit

# Why is this here?
yarn why package-name
Python
pip
# List outdated
pip list --outdated

# Update specific package
pip install --upgrade package-name

# Security audit
pip-audit  # Install: pip install pip-audit

# Freeze current dependencies
pip freeze > requirements.txt

# Check dependencies of a package
pip show package-name
poetry
# Show outdated
poetry show --outdated

# Update all
poetry update

# Update specific package
poetry update package-name

# Security check
poetry audit  # poetry-audit-plugin required

# Show dependency tree
poetry show --tree
pipenv
# Check for security vulnerabilities
pipenv check

# Update all
pipenv update

# Update specific
pipenv update package-name

# Show dependency graph
pipenv graph

優先度マトリクス

優先度種類対応期間例
P0重大な CVE(攻撃に利用されている)直ちにパッチを適用当日認証回避、RCE
P1高リスクの CVE またはフレームワークのメジャーアップデート移行を計画1~2 週間Next.js、React のメジャーバージョン
P2非推奨だが利用中代替を探す2~4 週間moment.js → date-fns
P3マイナー/パッチアップデートまとめて更新毎月破壊的変更を含まない更新
P4未使用の依存関係削除次回のクリーンアップ PR使用されていないインポート
優先度の判断ツリー
Is there a CVE?
├─ Yes → Is it critical/high severity?
│  ├─ Yes → P0 (patch immediately)
│  └─ No → P1 (plan update)
└─ No → Is package deprecated?
   ├─ Yes → Is it actively used?
   │  ├─ Yes → P2 (find replacement)
   │  └─ No → P4 (remove)
   └─ No → Is it outdated?
      ├─ Major version → P1 (plan migration)
      ├─ Minor/patch → P3 (batch update)
      └─ Unused → P4 (remove)

よく使われる置き換え先

日付/時刻ライブラリ
JavaScript/TypeScript
// ❌ moment.js (deprecated, 288KB minified)
import moment from 'moment';
const formatted = moment().format('YYYY-MM-DD');
const diff = moment(date1).diff(moment(date2), 'days');

// ✅ date-fns (tree-shakeable, 2-5KB per function)
import { format, differenceInDays } from 'date-fns';
const formatted = format(new Date(), 'yyyy-MM-dd');
const diff = differenceInDays(date1, date2);

// ✅ Native Intl (zero bundle cost)
const formatted = new Intl.DateTimeFormat('en-US').format(new Date());
const relative = new Intl.RelativeTimeFormat('en').format(-1, 'day'); // "1 day ago"
Python
# ❌ arrow (overhead for simple tasks)
import arrow
now = arrow.now().format('YYYY-MM-DD')

# ✅ Native datetime
from datetime import datetime
now = datetime.now().strftime('%Y-%m-%d')

# ✅ pendulum (for complex timezone handling)
import pendulum
now = pendulum.now('America/New_York')
ユーティリティライブラリ
JavaScript/TypeScript
// ❌ Full lodash import (70KB)
import _ from 'lodash';
const value = _.get(obj, 'path.to.value');
const unique = _.uniq(array);

// ✅ Specific imports (5-10KB)
import get from 'lodash/get';
import uniq from 'lodash/uniq';

// ✅ Native alternatives (0KB)
const value = obj?.path?.to?.value;           // Optional chaining
const unique = [...new Set(array)];           // Set
const keys = Object.keys(obj);                // Object.keys
const flat = array.flat();                    // Array.flat()
const grouped = Object.groupBy(arr, fn);      // Object.groupBy
HTTP クライアント
JavaScript/TypeScript
// ❌ axios (11KB) - often unnecessary
import axios from 'axios';
const { data } = await axios.get('/api/users');

// ✅ Native fetch (0KB) - built-in
const response = await fetch('/api/users');
const data = await response.json();

// ✅ ky (2KB) - if you need retries/timeout
import ky from 'ky';
const data = await ky.get('/api/users').json();
Python
# ❌ requests (large for serverless)
import requests
response = requests.get('https://api.example.com')

# ✅ httpx (async support, same API)
import httpx
async with httpx.AsyncClient() as client:
    response = await client.get('https://api.example.com')

# ✅ urllib (native, for simple cases)
from urllib.request import urlopen
response = urlopen('https://api.example.com')
テストライブラリ
JavaScript/TypeScript
// Consider consolidating test runners

// If using Jest + Vitest + Playwright separately:
// ✅ Vitest can replace Jest in most projects (faster, native ESM)
// ✅ Keep Playwright for E2E, use Vitest for unit/integration
バリデーションライブラリ
JavaScript/TypeScript
// ❌ Multiple validation libraries
import * as yup from 'yup';
import Joi from 'joi';
import { z } from 'zod';

// ✅ Pick one (Zod recommended for TypeScript)
import { z } from 'zod';
const schema = z.object({
  email: z.string().email(),
  age: z.number().min(0)
});

更新戦略

関連する更新をまとめる
# Update all ESLint-related packages together
pnpm update eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin

# Update all testing packages together
pnpm update vitest @vitest/ui @vitest/coverage-v8

# Update all Next.js packages together
pnpm update next react react-dom @types/react @types/react-dom
更新後にテストする
包括的なテストチェックリスト
# 1. Type check
pnpm tsc --noEmit

# 2. Lint
pnpm lint

# 3. Unit tests
pnpm test

# 4. Build verification
pnpm build

# 5. Dev server (smoke test)
pnpm dev
# Open browser, test key features

# 6. E2E tests (if available)
pnpm test:e2e
段階的な更新戦略
メジャーバージョンの更新の場合
# 1. Create branch
git checkout -b chore/update-nextjs-15

# 2. Update package.json
# Change "next": "^14.0.0" → "^15.0.0"

# 3. Install
pnpm install

# 4. Read migration guide
# Visit: nextjs.org/docs/upgrading

# 5. Address breaking changes
# Follow migration guide step-by-step

# 6. Test thoroughly
pnpm test && pnpm build

# 7. Commit and PR
git add .
git commit -m "chore: upgrade Next.js to v15"

クリーンアップのワークフロー

ステップ 1:未使用の依存関係を特定する
npx depcheck

出力例:

Unused dependencies
* lodash
* moment
* old-library

Unused devDependencies
* @types/old-package
* unused-test-lib
ステップ 2:使用されていないことを確認する
# Search codebase for imports
rg "from 'lodash'" --type ts
rg "import.*lodash" --type ts
rg "require\('lodash'\)" --type js

# If no results → safe to remove
ステップ 3:パッケージを削除する
pnpm remove lodash
ステップ 4:ロックファイルを更新する
# npm
rm package-lock.json
npm install

# pnpm
rm pnpm-lock.yaml
pnpm install

# yarn
rm yarn.lock
yarn install
ステップ 5:テストする
pnpm test
pnpm build
クリーンアップ PR のテンプレート
## Dependency Cleanup

### Security Updates (P0/P1)
- [ ] `next`: 14.0.4 → 14.2.3 (CVE-2024-XXXX)
- [ ] `jose`: 4.15.4 → 4.15.5 (CVE-2024-YYYY)

### Removed (Unused)
- [ ] `lodash` - replaced with native JS methods
- [ ] `moment` - replaced with date-fns
- [ ] `@types/old-package` - package no longer used

### Updated (Maintenance)
- [ ] `eslint`: 8.57.0 → 9.0.0
- [ ] `typescript`: 5.3.3 → 5.4.2

### Migration Notes
**lodash → Native**:
- `_.get()` → optional chaining `obj?.prop?.value`
- `_.uniq()` → `[...new Set(array)]`

**moment → date-fns**:
- `moment().format('YYYY-MM-DD')` → `format(new Date(), 'yyyy-MM-dd')`

### Testing
- [ ] All tests pass (`pnpm test`)
- [ ] Build succeeds (`pnpm build`)
- [ ] No runtime errors in dev (`pnpm dev`)
- [ ] E2E tests pass (if applicable)

### Bundle Size Impact
- Before: 2.4 MB
- After: 1.8 MB
- **Savings: 600 KB (25% reduction)**

セキュリティスキャン

自動セキュリティチェック
GitHub Actions
# .github/workflows/security.yml
name: Security Audit

on:
  schedule:
    - cron: '0 0 * * 1'  # Weekly on Monday
  pull_request:
  push:
    branches: [main]

jobs:
  audit:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      - name: Install dependencies
        run: npm ci

      - name: Run security audit
        run: npm audit --audit-level=high

      - name: Check for outdated packages
        run: npm outdated || true

      - name: Dependency review
        uses: actions/dependency-review-action@v4
        if: github.event_name == 'pull_request'
Snyk の統合
# .github/workflows/snyk.yml
name: Snyk Security

on: [push, pull_request]

jobs:
  security:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Run Snyk to check for vulnerabilities
        uses: snyk/actions/node@master
        env:
          SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
手動のセキュリティコマンド
# npm security audit
npm audit

# Show only high/critical
npm audit --audit-level=high

# Get JSON report
npm audit --json > audit-report.json

# Snyk (requires: npm install -g snyk)
snyk test                    # Test for vulnerabilities
snyk monitor                 # Continuous monitoring
snyk wizard                  # Interactive fixing

# Socket.dev (supply chain security)
npx socket-npm audit
CVE 対応プロセス
  1. 通知:セキュリティ勧告を受け取ります(GitHub、npm、Snyk)

  2. 影響を評価する:

    # Find where vulnerable package is used
    npm ls vulnerable-package
    
    # Check if we use vulnerable functionality
    rg "vulnerableFunction" --type ts
    
  3. パッチを適用する:

    # Update to patched version
    npm install [email protected]
    
    # Or update dependency that depends on it
    npm update parent-package
    
  4. 修正を検証する:

    npm audit
    # Should show 0 vulnerabilities
    
  5. テストしてデプロイする:

    pnpm test && pnpm build
    git commit -m "fix: patch CVE-2024-XXXX in vulnerable-package"
    

オープンソースの安全性

脆弱性スキャンで分かるのは「脆弱性があるかどうか」です。しかし、サードパーティのリスクには互いに独立した3つの側面があります。CVEだけで判断せず、最もリスクの高い側面を基準にしてください。

  • ライセンスリスク — ライセンスの種類による知的財産・法的リスク:
    • HIGH: 強いコピーレフト(GPL-2.0/3.0、AGPL-3.0、LGPL-2.1/3.0) — アプリケーション全体のソースコードを開示するリスクがあります。配布製品や商用製品ではブロックしてください。
    • MEDIUM: 弱いコピーレフト(MPL-2.0、EPL-1.0) — コンポーネントのファイルに加えた変更のみ開示が必要です。変更せずに使用する場合は問題ありません。
    • LOW: 寛容なライセンス(MIT、Apache-2.0、BSD) — 著作権表示のみ必要です。
    • UNKNOWN(NOASSERTION):ライセンスが特定されるまで、HIGHとして扱ってください。
  • CVEの重み付け — 単純な件数ではなく、深刻度(critical ≫ high ≫ medium ≫ low)に基づいて重み付けします。これにより、上記のP0〜P4優先度マトリクスをさらに精緻化できます。
  • 陳腐化 — 最新バージョンとの差を評価します。メジャーバージョン以上遅れている依存関係や、上流で保守されていない依存関係は、リスクを高く評価します。
# License audit
npx license-checker --failOn "GPL-3.0;AGPL-3.0;LGPL-3.0"   # JS/TS
pip-licenses --fail-on "GPL-3.0;AGPL-3.0"                  # Python

月次チェックリストに次の項目を追加してください。新たなHIGHティアまたはUNKNOWNのライセンスがないこと、critical/highのCVEはブロックし、medium/lowは担当者と期限を記録して追跡すること、移行計画なしにメジャーバージョンを1つ以上遅れている依存関係がないこと。

詳細なフレームワーク(ティア表、CVEの重み付けモデル、陳腐化のスコアリング、推移的依存関係の「友達の友達」信頼モデル)については、references/open-source-safety.md を参照してください。

CAST Highlightのオープンソース安全性の方法論をもとにしています (https://doc.casthighlight.com/)。ライセンスのティアは https://choosealicense.com/appendix/ に準拠しています。


まとめ

月次メンテナンスチェックリスト
## Dependency Maintenance - [YYYY-MM]

### Security
- [ ] Run `npm audit` and address high/critical issues
- [ ] Review GitHub security advisories
- [ ] Check Snyk dashboard (if integrated)

### Updates
- [ ] Check `npm outdated` for major updates
- [ ] Update patch versions: `npm update`
- [ ] Plan migration for deprecated packages

### Cleanup
- [ ] Run `npx depcheck` to find unused deps
- [ ] Remove packages with zero imports
- [ ] Deduplicate: `npm dedupe`

### Testing
- [ ] Run full test suite
- [ ] Check build succeeds
- [ ] Verify dev server works
- [ ] Test in production-like environment

### Documentation
- [ ] Update CHANGELOG.md
- [ ] Document breaking changes
- [ ] Update .env.example if needed
ベストプラクティス
  • 自動化する:週次監査用にGitHub Actionsを設定します
  • 更新をまとめる:関連する依存関係の更新をまとめます
  • 徹底的にテストする:更新後にテストを省略しないでください
  • 記録する:CHANGELOG.mdを最新の状態に保ちます
  • 影響を測定する:バンドルサイズの変化を追跡します
  • 最新情報を把握する:セキュリティアドバイザリを購読します
  • ロックファイルを使用する:package-lock.json/pnpm-lock.yamlをコミットします
  • 段階的に移行する:すべてを一度に更新しないでください

コメント