dependency-check

Évaluation avant ajout d'une nouvelle dépendance. Se charge sur : npm install <pkg>, npm add <pkg>, yarn add <pkg>, pnpm add <pkg>, bun add <pkg>, pip install <pkg>, poetry add <pkg>, uv add <pkg>, composer require <pkg>, cargo add <crate>, go get <pkg>, gem install <pkg>, ou édition manuelle de package.json, requirements.txt, pyproject.toml, composer.json, Cargo.toml, go.mod, Gemfile. Vérifie : solution native possible, taille du package, maintenance (last release, open issues, stars), licence, alternative plus légère, impact sécurité. Ne se charge PAS quand : mise à jour (npm update, composer update), suppression, audit, ou discussion de dépendances déjà installées.

Dependency Check — Évaluation avant ajout

Ce skill s'active quand une nouvelle dépendance est sur le point d'être ajoutée au projet.

Questions obligatoires

Avant d'ajouter une dépendance, répondre à :

  1. C'est nécessaire ? — Le langage/framework ne fournit-il pas déjà cette fonctionnalité nativement ?
  2. Une seule utilisation ? — Si on l'utilise à un seul endroit, 10-20 lignes de code maison suffisent-elles ?
  3. Alternative plus légère ? — Existe-t-il un package plus petit qui fait le strict nécessaire ?
  4. Activement maintenu ? — Dernière release, issues ouvertes, nombre de contributeurs
  5. Impact sur le bundle ? — Taille, tree-shaking possible ?

Ordre de préférence

1. Natif (stdlib, API du langage/framework)
   ↓ pas disponible
2. Dépendance établie (>10k stars, maintenance active, écosystème large)
   ↓ trop lourde
3. Dépendance légère (focalisée, peu de sous-dépendances)
   ↓ pas trouvée
4. Code custom (documenté, testé)

Signaux d'alerte

SignalRisque
Pas de release depuis >1 anAbandon potentiel
Beaucoup d'issues ouvertes sans réponseMaintenance faible
Trop de sous-dépendancesSurface d'attaque large
Pas de types TypeScriptIntégration difficile
Licence restrictive (GPL dans un projet MIT)Incompatibilité
Package qui fait "tout"Over-engineering importé

Exemples courants

Souvent inutile

On ajoute...Alors que...
lodash (entier)lodash/get ou natif (?., .flat(), .map()) suffit
momentIntl.DateTimeFormat ou date-fns (tree-shakable)
axiosfetch natif suffit dans la plupart des cas
uuidcrypto.randomUUID() est natif
left-padC'est une ligne de code
is-oddn % 2 !== 0

Souvent justifié

DépendancePourquoi
zod / joiValidation de schemas — complexe à réimplémenter correctement
bcrypt / argon2Crypto — ne JAMAIS réimplémenter soi-même
ORM (prisma, drizzle)Requêtes typées, migrations, sécurité SQL
Framework de test (vitest, jest)Infrastructure de test complète

Par écosystème

npm (JavaScript / TypeScript)

Souvent évitableAlternative native ou légère
lodashNatif ES2024+ (.structuredClone(), ?., Object.groupBy())
moment / dayjsIntl.DateTimeFormat, Temporal (stage 3)
axiosfetch (natif Node 18+, navigateurs)
uuidcrypto.randomUUID()
dotenv--env-file (Node 20+)
node-fetchfetch natif (Node 18+)
chalkutil.styleText() (Node 21+)

pip (Python)

Souvent évitableAlternative
requests (pour du simple)urllib.request (stdlib) ou httpx (async)
python-dotenvos.environ + .env dans le runner
arrowdatetime (stdlib)
sixPython 3 natif

composer (PHP)

Souvent évitableAlternative
guzzlehttp/guzzle (simple)file_get_contents + stream_context ou curl
nesbot/carbon (basique)DateTimeImmutable natif
illuminate/support (hors Laravel)Fonctions natives PHP 8+
ramsey/uuidrandom_bytes() + format UUID

Comportement

  • Proposer un défaut — toujours recommander la solution la plus légère (natif > lib établie > lib légère > custom) avec une alternative si le défaut ne convient pas
  • Signaler quand une dep semble évitable — proposer l'alternative
  • Ne pas bloquer si l'utilisateur a fait son choix consciemment
  • Vérifier la compatibilité de licence avec le projet
  • Si ajout justifié → s'assurer que la dep est dans CLAUDE.md section "Dépendances clés"