Dependency Manager Server
Panoramica
Il server dependency-manager e' dedicato alla gestione e all'analisi delle dipendenze di un progetto Node.js. Risolve tre problemi critici nello sviluppo software moderno:
- Vulnerabilita' di sicurezza: le dipendenze possono contenere falle note (CVE) che espongono l'applicazione a rischi
- Dipendenze inutilizzate: packages dichiarati in
package.jsonma mai importati aumentano la dimensione del bundle e la superficie di attacco - Incompatibilita' di licenza: licenze copyleft (GPL, AGPL) possono imporre restrizioni indesiderate sulla distribuzione del software
+--------------------------------------------------------+
| dependency-manager server |
| |
| +---------------------------------------------------+ |
| | Tool Layer | |
| | | |
| | check-vulnerabilities find-unused | |
| | license-audit | |
| +---------------------------------------------------+ |
| | | |
| v v |
| +------------------+ +----------------------+ |
| | child_process | | fs (node_modules) | |
| | execSync | | readFileSync | |
| | (npm audit) | | | |
| +------------------+ +----------------------+ |
| | |
| v |
| +---------------------------------------------------+ |
| | Event Bus: code:dependency-alert | |
| +---------------------------------------------------+ |
+--------------------------------------------------------+
Caratteristiche principali
- Integrazione npm audit: wrapper attorno a
npm audit --jsoncon parsing strutturato - Scansione import: analisi ricorsiva dei file sorgente per trovare dipendenze inutilizzate
- Audit licenze: lettura diretta dei
package.jsoninnode_modules - Alert automatici: pubblicazione eventi per vulnerabilita' critiche/alte
Tabella dei Tool
[object Object],[object Object],[object Object]
undefined
Architettura
Il server e' stateless e non possiede servizi interni. Ogni tool lavora direttamente con il filesystem e con processi child.
projectPath
|
+-- package.json <--- letto da tutti e 3 i tool
|
+-- node_modules/ <--- letto da license-audit
| +-- pkg-a/
| | +-- package.json (campo "license")
| +-- pkg-b/
| +-- package.json
|
+-- src/ <--- scansionato da find-unused
+-- index.ts
+-- app.ts
+-- utils/
Flusso di `check-vulnerabilities`
- Verifica esistenza di
package.jsonnel percorso indicato - Esegue
npm audit --jsoncon timeout di 60 secondi - Gestisce il codice di uscita non-zero (npm audit esce con errore se trova vulnerabilita')
- Parsa l'output JSON nel formato npm v7+
- Raggruppa per severita':
critical,high,moderate,low,info - Per ogni vulnerabilita' critica/alta, pubblica evento
code:dependency-alert
Flusso di `find-unused`
- Legge
dependenciesedevDependenciesdapackage.json - Raccoglie ricorsivamente tutti i file
.ts,.js,.tsx,.jsx - Salta le directory:
node_modules,dist,build,.git,coverage - Estrae i nomi dei pacchetti da:
- Import ES modules:
import ... from 'package' - CommonJS:
require('package') - Import dinamici:
import('package')
- Import ES modules:
- Gestisce i pacchetti scoped:
@scope/package - Confronta le dipendenze dichiarate con quelle importate
- Riporta separatamente
unusedDependencieseunusedDevDependencies
Flusso di `license-audit`
- Legge tutte le dipendenze da
package.json - Per ogni dipendenza, legge il
package.jsoninnode_modules/<dep>/ - Estrae il campo
license(stringa, oggetto{type, url}, o array legacylicenses) - Confronta con la lista di licenze copyleft:
- GPL (2.0, 3.0, -only, -or-later)
- AGPL (1.0, 3.0)
- LGPL (2.0, 2.1, 3.0)
- MPL-2.0, EUPL, CPAL-1.0, OSL-3.0, CC-BY-SA-4.0
- Raggruppa le dipendenze per tipo di licenza
- Segnala separatamente le dipendenze con licenza copyleft
Integrazione Event Bus
Eventi pubblicati
[object Object],[object Object],[object Object],[object Object]
undefined
Eventi sottoscritti
Nessuno.
Interazioni con altri server
+---------------------+ code:dependency-alert +-------------------+
| dependency-manager | --------------------------> | standup-notes |
| | | agile-metrics |
+---------------------+ +-------------------+
^
| (input: projectPath)
|
+---------------------+
| project-scaffolding | genera progetti con dipendenze che
| | dependency-manager puo' poi analizzare
+---------------------+
[object Object],[object Object],[object Object]
undefined
Esempi di utilizzo
Controllo vulnerabilita'
Richiesta:
{
"tool": "check-vulnerabilities",
"arguments": {
"projectPath": "/home/user/my-project"
}
}
Risposta (semplificata):
{
"project": "my-project",
"totalVulnerabilities": 5,
"severityCounts": {
"high": 2,
"moderate": 2,
"low": 1
},
"vulnerabilities": {
"high": [
{
"name": "lodash",
"severity": "high",
"title": "Prototype Pollution",
"url": "https://github.com/advisories/GHSA-xxxx",
"range": "<4.17.21",
"fixAvailable": { "name": "lodash", "version": "4.17.21" }
}
]
},
"metadata": {
"totalDependencies": 142,
"devDependencies": 38,
"prodDependencies": 104
}
}
Ricerca dipendenze inutilizzate
Richiesta:
{
"tool": "find-unused",
"arguments": {
"projectPath": "/home/user/my-project"
}
}
Risposta:
{
"project": "my-project",
"sourceFilesScanned": 47,
"summary": {
"totalDependencies": 12,
"totalDevDependencies": 8,
"unusedDependencies": 2,
"unusedDevDependencies": 1
},
"unusedDependencies": ["moment", "lodash"],
"unusedDevDependencies": ["@types/lodash"],
"note": "Dependencies may be used in config files, scripts, or other non-source files."
}
Audit licenze
Richiesta:
{
"tool": "license-audit",
"arguments": {
"projectPath": "/home/user/my-project"
}
}
Risposta (semplificata):
{
"project": "my-project",
"summary": {
"totalDependenciesChecked": 20,
"uniqueLicenses": 4,
"copyleftCount": 1,
"notFoundInNodeModules": 0
},
"copyleftWarnings": [
{ "name": "some-gpl-lib", "version": "2.1.0", "license": "GPL-3.0" }
],
"byLicense": {
"MIT": [{ "name": "express", "version": "4.21.0" }],
"ISC": [{ "name": "glob", "version": "10.3.0" }],
"GPL-3.0": [{ "name": "some-gpl-lib", "version": "2.1.0" }]
}
}
Sviluppi futuri
- Supporto pnpm/yarn: analisi dei lockfile specifici oltre a npm
- Aggiornamenti automatici: suggerimento di versioni aggiornate per dipendenze obsolete
- Policy di licenza configurabile: file
.license-policy.jsonper definire licenze accettate/rifiutate - Cache risultati audit: evitare chiamate ripetute a npm audit per lo stesso progetto
- Scansione profonda: analisi degli import transitivi (dipendenze di dipendenze)
- Integrazione con
cicd-monitor: trigger automatico dell'audit su ogni build - Report PDF/HTML: generazione di report formattati per stakeholder non tecnici
- Supporto monorepo: analisi coordinata di workspace pnpm/npm