secmanifest 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +308 -0
- package/package.json +54 -0
- package/src/cli.ts +138 -0
- package/src/commands/audit.ts +249 -0
- package/src/commands/fix.ts +88 -0
- package/src/commands/watch.ts +40 -0
- package/src/core/fixer.ts +89 -0
- package/src/core/html-report.ts +259 -0
- package/src/core/notify.ts +153 -0
- package/src/core/package-manager.ts +85 -0
- package/src/core/project-analyzer.ts +84 -0
- package/src/core/reporter.ts +170 -0
- package/src/i18n/index.ts +256 -0
- package/src/scanners/backdoors.ts +192 -0
- package/src/scanners/binaries.ts +102 -0
- package/src/scanners/bundle-size.ts +114 -0
- package/src/scanners/duplicates.ts +116 -0
- package/src/scanners/integrity.ts +108 -0
- package/src/scanners/licenses.ts +111 -0
- package/src/scanners/lockfile-drift.ts +182 -0
- package/src/scanners/malware.ts +148 -0
- package/src/scanners/metadata.ts +148 -0
- package/src/scanners/node-version.ts +71 -0
- package/src/scanners/obfuscation.ts +151 -0
- package/src/scanners/outdated.ts +76 -0
- package/src/scanners/secrets.ts +224 -0
- package/src/scanners/socket-dev.ts +140 -0
- package/src/scanners/transitive.ts +97 -0
- package/src/scanners/vulnerabilities.ts +63 -0
- package/src/utils/cache.ts +59 -0
- package/src/utils/http.ts +134 -0
- package/src/utils/registry.ts +170 -0
- package/src/utils/types.ts +67 -0
package/README.md
ADDED
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
# secmanifest
|
|
2
|
+
|
|
3
|
+
Herramienta de CLI para auditoria de seguridad profunda en proyectos JavaScript/TypeScript. Detecta vulnerabilidades, malware, backdoors, secrets expuestos y paquetes comprometidos antes de que te hackeen.
|
|
4
|
+
|
|
5
|
+
## Instalacion
|
|
6
|
+
|
|
7
|
+
### Opcion 1: Desde el repositorio
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
git clone https://github.com/tu-usuario/secmanifest.git
|
|
11
|
+
cd secmanifest
|
|
12
|
+
bun install
|
|
13
|
+
bun run build
|
|
14
|
+
bun link
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
### Opcion 2: Compilar directamente
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
bun install
|
|
21
|
+
bun run build
|
|
22
|
+
# El binario se genera como secmanifest.exe
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### Requisitos
|
|
26
|
+
|
|
27
|
+
- [Bun](https://bun.sh) >= 1.0
|
|
28
|
+
- Un gestor de paquetes seguro: **pnpm**, **bun** o **yarn** (npm esta bloqueado por seguridad)
|
|
29
|
+
|
|
30
|
+
## Comandos Disponibles
|
|
31
|
+
|
|
32
|
+
### `secmanifest audit`
|
|
33
|
+
|
|
34
|
+
Auditoria de seguridad completa. Ejecuta 10 escaners diferentes.
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
secmanifest audit # Audita directorio actual
|
|
38
|
+
secmanifest audit ./mi-proyecto # Audita un directorio especifico
|
|
39
|
+
secmanifest audit --json # Output en formato JSON
|
|
40
|
+
secmanifest audit --quick # Escaneo rapido (sin API externa)
|
|
41
|
+
secmanifest audit --auto-fix # Arregla paquetes inseguros automaticamente
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
#### Opciones
|
|
45
|
+
|
|
46
|
+
| Flag | Descripcion |
|
|
47
|
+
|------|-------------|
|
|
48
|
+
| `--json` | Output en formato JSON para integracion con otros tools |
|
|
49
|
+
| `--verbose` | Muestra errores detallados durante el escaneo |
|
|
50
|
+
| `--quick` | Escaneo local sin consultar Sonatype OSS Index ni paquetes outdated |
|
|
51
|
+
| `--auto-fix` | Arregla automaticamente paquetes con "latest" o deprecated |
|
|
52
|
+
| `--skip-malware` | Omitir escaneo de malware y typosquatting |
|
|
53
|
+
| `--skip-secrets` | Omitir escaneo de secrets y credenciales |
|
|
54
|
+
| `--skip-licenses` | Omitir escaneo de licencias restrictivas |
|
|
55
|
+
| `--skip-outdated` | Omitir escaneo de paquetes desactualizados |
|
|
56
|
+
| `--skip-metadata` | Omitir escaneo de metadata sospechosa |
|
|
57
|
+
| `--skip-obfuscation` | Omitir escaneo de codigo ofuscado |
|
|
58
|
+
| `--skip-node-version` | Omitir chequeo de Node.js EOL |
|
|
59
|
+
|
|
60
|
+
### `secmanifest check`
|
|
61
|
+
|
|
62
|
+
Escaneo rapido de seguridad sin consultar APIs externas. Ideal para CI/CD o ejecuciones rapidas.
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
secmanifest check # Escaneo rapido
|
|
66
|
+
secmanifest check --json # Output JSON
|
|
67
|
+
secmanifest check ./proyecto # Directorio especifico
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### `secmanifest fix`
|
|
71
|
+
|
|
72
|
+
Arregla paquetes con versiones inseguras automaticamente. Consulta el registry de npm para encontrar versiones seguras.
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
secmanifest fix # Analiza y arregla todos los paquetes inseguros
|
|
76
|
+
secmanifest fix chalk lodash # Arregla paquetes especificos
|
|
77
|
+
secmanifest fix --dry-run # Muestra que haria sin ejecutar cambios
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
#### Como funciona el auto-fix
|
|
81
|
+
|
|
82
|
+
1. Detecta paquetes con `"latest"`, versiones deprecated o con vulnerabilidades criticas
|
|
83
|
+
2. Consulta el registry de npm para encontrar la ultima version segura
|
|
84
|
+
3. Desinstala la version insegura
|
|
85
|
+
4. Instala la version segura con `^version`
|
|
86
|
+
5. Si falla, restaura la version original automaticamente
|
|
87
|
+
|
|
88
|
+
## Escaners de Seguridad
|
|
89
|
+
|
|
90
|
+
### 1. Malware y Typosquatting (`malware.ts`)
|
|
91
|
+
|
|
92
|
+
Detecta paquetes maliciosos conocidos y suplantaciones de paquetes populares.
|
|
93
|
+
|
|
94
|
+
- Lista de paquetes comprometidos conocidos (event-stream, faker.js, colors.js, etc.)
|
|
95
|
+
- Deteccion de typosquatting con distancia de Levenshtein (ej: `exress` vs `express`)
|
|
96
|
+
- Analisis de paquetes con nombres sospechosamente similares a paquetes populares
|
|
97
|
+
|
|
98
|
+
### 2. Backdoors en Manifiestos (`backdoors.ts`)
|
|
99
|
+
|
|
100
|
+
Analiza `package.json` en busca de ajustes peligrosos que atacantes pueden explotar.
|
|
101
|
+
|
|
102
|
+
- Scripts peligrosos: `preinstall`, `postinstall`, `install`, `prepare`
|
|
103
|
+
- Dependencias que apuntan a repositorios Git externos sin version fija
|
|
104
|
+
- Version ranges abiertos (`*`, `>=0.0.0`)
|
|
105
|
+
- Dependencias con `"latest"` (vector de ataque de cadena de suministro)
|
|
106
|
+
- Hooks de ciclo de vida complejos con multiples comandos encadenados
|
|
107
|
+
|
|
108
|
+
### 3. Drift en Lockfile (`lockfile-drift.ts`)
|
|
109
|
+
|
|
110
|
+
Detecta paquetes instalados pero no declarados en `package.json`.
|
|
111
|
+
|
|
112
|
+
- Soporte para `pnpm-lock.yaml`, `bun.lock` y `yarn.lock`
|
|
113
|
+
- Detecta "paquetes fantasma" que pueden ser dependencias no intencionadas
|
|
114
|
+
- Identifica divergencias entre lo declarado y lo instalado
|
|
115
|
+
|
|
116
|
+
### 4. Secrets y Credenciales (`secrets.ts`)
|
|
117
|
+
|
|
118
|
+
Escanea el codigo fuente y archivos de entorno en busca de secretos expuestos.
|
|
119
|
+
|
|
120
|
+
- AWS Access Keys y Secret Keys
|
|
121
|
+
- GitHub/GitLab tokens (PAT, Fine-grained)
|
|
122
|
+
- Slack tokens y webhooks
|
|
123
|
+
- Stripe API keys
|
|
124
|
+
- Google API keys
|
|
125
|
+
- Bearer tokens y JWTs
|
|
126
|
+
- Connection strings (MongoDB, MySQL, PostgreSQL, Redis)
|
|
127
|
+
- Archivos `.env` committeados
|
|
128
|
+
- Verificacion de `.gitignore`
|
|
129
|
+
|
|
130
|
+
### 5. Licencias Restringidas (`licenses.ts`)
|
|
131
|
+
|
|
132
|
+
Detecta paquetes con licencias que pueden forzar divulgacion de codigo privado.
|
|
133
|
+
|
|
134
|
+
- AGPL-3.0: Requiere liberar codigo incluso en SaaS
|
|
135
|
+
- GPL-2.0/3.0: Copyleft fuerte que aplica a trabajos derivados
|
|
136
|
+
- SSPL: Requiere liberar todo el stack de servicios
|
|
137
|
+
- EUPL/OSL: Copyleft con implicaciones legales
|
|
138
|
+
|
|
139
|
+
### 6. Metadata Sospechosa (`metadata.ts`)
|
|
140
|
+
|
|
141
|
+
Analiza metadatos de paquetes instalados en busca de anomalias.
|
|
142
|
+
|
|
143
|
+
- Paquete sin repositorio asociado
|
|
144
|
+
- Paquete sin licencia declarada
|
|
145
|
+
- Paquete con codigo nativo (gypfile)
|
|
146
|
+
- Scripts que acceden a red durante instalacion
|
|
147
|
+
|
|
148
|
+
### 7. Codigo Ofuscado (`obfuscation.ts`)
|
|
149
|
+
|
|
150
|
+
Detecta patronies de ofuscacion comunes en malware.
|
|
151
|
+
|
|
152
|
+
- Ejecucion de codigo codificado en Base64
|
|
153
|
+
- `eval()` con concatenacion de strings
|
|
154
|
+
- `String.fromCharCode` y secuencias hex/unicode
|
|
155
|
+
- Compresion/descompresion en tiempo de ejecucion
|
|
156
|
+
- `child_process` para ejecucion de comandos del sistema
|
|
157
|
+
|
|
158
|
+
### 8. Version Node.js EOL (`node-version.ts`)
|
|
159
|
+
|
|
160
|
+
Detecta si el proyecto requiere versiones de Node.js sin soporte.
|
|
161
|
+
|
|
162
|
+
- Versiones End-of-Life (0.10 - 19)
|
|
163
|
+
- Recomendacion de versiones soportadas
|
|
164
|
+
|
|
165
|
+
### 9. Vulnerabilidades (Sonatype OSS Index) (`vulnerabilities.ts`)
|
|
166
|
+
|
|
167
|
+
Consulta la base de datos de Sonatype para vulnerabilidades conocidas.
|
|
168
|
+
|
|
169
|
+
- CVEs conocidas con severidad y CVSS score
|
|
170
|
+
- Rate limiting automatico con retry
|
|
171
|
+
- Soporte para batch de 128 paquetes por request
|
|
172
|
+
|
|
173
|
+
### 10. Paquetes Desactualizados (`outdated.ts`)
|
|
174
|
+
|
|
175
|
+
Detecta paquetes con versiones nuevas disponibles.
|
|
176
|
+
|
|
177
|
+
- Paquetes con actualizaciones mayores (breaking changes)
|
|
178
|
+
- Paquetes con actualizaciones menores (patches)
|
|
179
|
+
|
|
180
|
+
## Ejemplo de Salida
|
|
181
|
+
|
|
182
|
+
```
|
|
183
|
+
╔══════════════════════════════════════╗
|
|
184
|
+
║ SECMANIFEST - Security Audit ║
|
|
185
|
+
╚══════════════════════════════════════╝
|
|
186
|
+
|
|
187
|
+
Resumen del Proyecto
|
|
188
|
+
─────────────────────────────────────
|
|
189
|
+
Proyecto: mi-app
|
|
190
|
+
Directorio: /home/user/mi-app
|
|
191
|
+
Gestor: pnpm v9.0.0
|
|
192
|
+
Paquetes: 45
|
|
193
|
+
Hallazgos: 3
|
|
194
|
+
Tiempo: 8.21s
|
|
195
|
+
|
|
196
|
+
Desglose por Severidad:
|
|
197
|
+
[!!] Alto: 1
|
|
198
|
+
[!] Medio: 1
|
|
199
|
+
* Bajo: 1
|
|
200
|
+
|
|
201
|
+
Score de Riesgo:
|
|
202
|
+
[██████████████████░░░░░░░░░░░░] 59/100
|
|
203
|
+
|
|
204
|
+
ℹ PROYECTO CON RIESGOS MODERADOS - Revisión recomendada
|
|
205
|
+
|
|
206
|
+
Hallazgos Detallados:
|
|
207
|
+
|
|
208
|
+
┌──────────────┬──────────────┬──────────────────────────────────┬────────────┐
|
|
209
|
+
│ Severidad │ Categoria │ Titulo │ Paquete │
|
|
210
|
+
├──────────────┼──────────────┼──────────────────────────────────┼────────────┤
|
|
211
|
+
│ [!!] high │ Backdoor │ Dependencia con "latest": axios │ axios │
|
|
212
|
+
│ [!] medium │ Backdoor │ Rango de version abierto: lodash │ lodash │
|
|
213
|
+
│ * low │ Malware │ Paquete sin repositorio: foo │ foo │
|
|
214
|
+
└──────────────┴──────────────┴──────────────────────────────────┴────────────┘
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
## Arquitectura
|
|
218
|
+
|
|
219
|
+
```
|
|
220
|
+
secmanifest/
|
|
221
|
+
├── src/
|
|
222
|
+
│ ├── cli.ts # Entry point - Commander setup
|
|
223
|
+
│ ├── commands/
|
|
224
|
+
│ │ ├── audit.ts # Comando principal de auditoria
|
|
225
|
+
│ │ └── fix.ts # Comando de auto-fix
|
|
226
|
+
│ ├── core/
|
|
227
|
+
│ │ ├── package-manager.ts # Deteccion de gestores de paquetes
|
|
228
|
+
│ │ ├── project-analyzer.ts # Analisis de package.json
|
|
229
|
+
│ │ ├── reporter.ts # Reporte en terminal con colores
|
|
230
|
+
│ │ └── fixer.ts # Logica de desinstalar/reinstalar
|
|
231
|
+
│ ├── scanners/
|
|
232
|
+
│ │ ├── vulnerabilities.ts # Sonatype OSS Index API
|
|
233
|
+
│ │ ├── malware.ts # Typosquatting + paquetes maliciosos
|
|
234
|
+
│ │ ├── backdoors.ts # Scripts peligrosos en package.json
|
|
235
|
+
│ │ ├── lockfile-drift.ts # Comparacion package.json vs lockfile
|
|
236
|
+
│ │ ├── secrets.ts # Credenciales expuestas
|
|
237
|
+
│ │ ├── licenses.ts # Licencias restrictivas
|
|
238
|
+
│ │ ├── metadata.ts # Metadatos sospechosos
|
|
239
|
+
│ │ ├── obfuscation.ts # Codigo ofuscado
|
|
240
|
+
│ │ ├── outdated.ts # Paquetes desactualizados
|
|
241
|
+
│ │ └── node-version.ts # Node.js EOL
|
|
242
|
+
│ └── utils/
|
|
243
|
+
│ ├── http.ts # Cliente HTTP con rate limiting
|
|
244
|
+
│ ├── registry.ts # Consulta npm registry
|
|
245
|
+
│ └── types.ts # Tipos compartidos
|
|
246
|
+
├── package.json
|
|
247
|
+
├── tsconfig.json
|
|
248
|
+
└── .gitignore
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
## Veto a npm
|
|
252
|
+
|
|
253
|
+
secmanifest tiene un **veto absoluto a npm** como gestor de paquetes. Esto se debe a sus historial de vulnerabilidades en la ejecucion de scripts de dependencias. La herramienta detecta automaticamente el gestor de paquetes y sigue este orden de prioridad:
|
|
254
|
+
|
|
255
|
+
1. **pnpm** (prioritario)
|
|
256
|
+
2. **bun** (alternativa segura)
|
|
257
|
+
3. **yarn** (ultimo recurso)
|
|
258
|
+
4. **npm** → Bloqueado
|
|
259
|
+
|
|
260
|
+
Si no se detecta ningun gestor seguro, la herramienta pregunta si desea continuar.
|
|
261
|
+
|
|
262
|
+
## Como Ayudar a Mejorar el Proyecto
|
|
263
|
+
|
|
264
|
+
### Funciones Pendientes
|
|
265
|
+
|
|
266
|
+
- [ ] Integracion con Socket.dev API para deteccion de supply chain attacks
|
|
267
|
+
- [ ] Analisis de dependencias transitivas (no solo directas)
|
|
268
|
+
- [ ] Deteccion de paquetes con binarios sospechosos
|
|
269
|
+
- [ ] Integracion con GitHub Actions para CI/CD
|
|
270
|
+
- [ ] Modo watch para auditoria continua
|
|
271
|
+
- [ ] Reporte en HTML exportable
|
|
272
|
+
- [ ] Integracion con Slack/Discord para notificaciones
|
|
273
|
+
- [ ] Cache local de resultados de Sonatype
|
|
274
|
+
- [ ] Soporte para monorepos (workspaces)
|
|
275
|
+
- [ ] Deteccion de dependencias duplicadas
|
|
276
|
+
- [ ] Analisis de bundle size para detectar paquetes sospechosamente grandes
|
|
277
|
+
- [ ] Verificacion de integridad con checksums
|
|
278
|
+
|
|
279
|
+
### Contribuir
|
|
280
|
+
|
|
281
|
+
1. Fork el repositorio
|
|
282
|
+
2. Crea una branch para tu feature (`git checkout -b feature/nueva-funcion`)
|
|
283
|
+
3. Haz commit de tus cambios (`git commit -m 'Add nueva funcion'`)
|
|
284
|
+
4. Push a la branch (`git push origin feature/nueva-funcion`)
|
|
285
|
+
5. Abre un Pull Request
|
|
286
|
+
|
|
287
|
+
### Desarrollo
|
|
288
|
+
|
|
289
|
+
```bash
|
|
290
|
+
# Instalar dependencias
|
|
291
|
+
bun install
|
|
292
|
+
|
|
293
|
+
# Ejecutar en desarrollo
|
|
294
|
+
bun run dev audit
|
|
295
|
+
|
|
296
|
+
# Verificar tipos
|
|
297
|
+
bun run typecheck
|
|
298
|
+
|
|
299
|
+
# Compilar binario
|
|
300
|
+
bun run build
|
|
301
|
+
|
|
302
|
+
# Registrar globalmente
|
|
303
|
+
bun link
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
## Licencia
|
|
307
|
+
|
|
308
|
+
MIT
|
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "secmanifest",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Deep security auditing tool for JavaScript/TypeScript projects. Detects vulnerabilities, malware, backdoors, secrets, and compromised packages.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "src/cli.ts",
|
|
7
|
+
"bin": {
|
|
8
|
+
"secmanifest": "./src/cli.ts"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"dev": "bun run src/cli.ts",
|
|
12
|
+
"build": "bun build src/cli.ts --compile --outfile secmanifest",
|
|
13
|
+
"typecheck": "bunx tsc --noEmit"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"security",
|
|
17
|
+
"audit",
|
|
18
|
+
"vulnerabilities",
|
|
19
|
+
"malware",
|
|
20
|
+
"supply-chain",
|
|
21
|
+
"npm",
|
|
22
|
+
"javascript",
|
|
23
|
+
"typescript",
|
|
24
|
+
"cli",
|
|
25
|
+
"scanner",
|
|
26
|
+
"backdoor",
|
|
27
|
+
"secrets"
|
|
28
|
+
],
|
|
29
|
+
"author": "",
|
|
30
|
+
"license": "MIT",
|
|
31
|
+
"files": [
|
|
32
|
+
"src/**/*",
|
|
33
|
+
"README.md"
|
|
34
|
+
],
|
|
35
|
+
"repository": {
|
|
36
|
+
"type": "git",
|
|
37
|
+
"url": ""
|
|
38
|
+
},
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"commander": "^14.0.3",
|
|
41
|
+
"@clack/prompts": "^1.5.0",
|
|
42
|
+
"chalk": "^5.4.1",
|
|
43
|
+
"cli-table3": "^0.6.5"
|
|
44
|
+
},
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"@types/bun": "latest"
|
|
47
|
+
},
|
|
48
|
+
"peerDependencies": {
|
|
49
|
+
"typescript": "^5"
|
|
50
|
+
},
|
|
51
|
+
"engines": {
|
|
52
|
+
"node": ">=18"
|
|
53
|
+
}
|
|
54
|
+
}
|
package/src/cli.ts
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
|
|
3
|
+
import { Command } from "commander";
|
|
4
|
+
import { initI18n, setLocale, t } from "./i18n/index.js";
|
|
5
|
+
import { runAudit } from "./commands/audit.js";
|
|
6
|
+
import { runFix } from "./commands/fix.js";
|
|
7
|
+
import { runWatch } from "./commands/watch.js";
|
|
8
|
+
import { saveConfig } from "./core/notify.js";
|
|
9
|
+
import { cacheClear } from "./utils/cache.js";
|
|
10
|
+
|
|
11
|
+
const program = new Command();
|
|
12
|
+
|
|
13
|
+
initI18n();
|
|
14
|
+
|
|
15
|
+
program
|
|
16
|
+
.name("secmanifest")
|
|
17
|
+
.description(t("cli.description"))
|
|
18
|
+
.version("1.0.0");
|
|
19
|
+
|
|
20
|
+
program
|
|
21
|
+
.command("audit")
|
|
22
|
+
.description("Deep security audit of the project")
|
|
23
|
+
.argument("[path]", "Directory to audit", ".")
|
|
24
|
+
.option("--json", "JSON output")
|
|
25
|
+
.option("--verbose", "Show detailed errors during scan")
|
|
26
|
+
.option("--quick", "Quick scan (no external APIs)")
|
|
27
|
+
.option("--auto-fix", "Auto-fix insecure packages")
|
|
28
|
+
.option("--html [path]", "Generate exportable HTML report")
|
|
29
|
+
.option("--notify", "Send notifications to Slack/Discord")
|
|
30
|
+
.option("--lang <locale>", "Language (en/es)", "en")
|
|
31
|
+
.option("--skip-malware", "Skip malware/typosquatting scan")
|
|
32
|
+
.option("--skip-secrets", "Skip secrets/credentials scan")
|
|
33
|
+
.option("--skip-licenses", "Skip license scan")
|
|
34
|
+
.option("--skip-outdated", "Skip outdated packages scan")
|
|
35
|
+
.option("--skip-metadata", "Skip metadata scan")
|
|
36
|
+
.option("--skip-obfuscation", "Skip obfuscation scan")
|
|
37
|
+
.option("--skip-node-version", "Skip Node.js EOL check")
|
|
38
|
+
.option("--skip-socket", "Skip Socket.dev scan")
|
|
39
|
+
.option("--skip-transitive", "Skip transitive dependencies scan")
|
|
40
|
+
.option("--skip-binaries", "Skip suspicious binaries scan")
|
|
41
|
+
.option("--skip-duplicates", "Skip duplicate dependencies scan")
|
|
42
|
+
.option("--skip-bundle-size", "Skip bundle size analysis")
|
|
43
|
+
.option("--skip-integrity", "Skip integrity check")
|
|
44
|
+
.action(async (path, options) => {
|
|
45
|
+
setLocale(options.lang);
|
|
46
|
+
try {
|
|
47
|
+
await runAudit(path, options);
|
|
48
|
+
} catch (error) {
|
|
49
|
+
console.error(
|
|
50
|
+
`${t("error.fatal")} ${error instanceof Error ? error.message : String(error)}`,
|
|
51
|
+
);
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
program
|
|
57
|
+
.command("check")
|
|
58
|
+
.description("Quick security scan (no external APIs)")
|
|
59
|
+
.argument("[path]", "Directory to audit", ".")
|
|
60
|
+
.option("--json", "JSON output")
|
|
61
|
+
.option("--verbose", "Show detailed errors")
|
|
62
|
+
.option("--lang <locale>", "Language (en/es)", "en")
|
|
63
|
+
.action(async (path, options) => {
|
|
64
|
+
setLocale(options.lang);
|
|
65
|
+
try {
|
|
66
|
+
await runAudit(path, { ...options, quick: true });
|
|
67
|
+
} catch (error) {
|
|
68
|
+
console.error(
|
|
69
|
+
`${t("error.fatal")} ${error instanceof Error ? error.message : String(error)}`,
|
|
70
|
+
);
|
|
71
|
+
process.exit(1);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
program
|
|
76
|
+
.command("fix")
|
|
77
|
+
.description("Fix packages with insecure versions (latest, deprecated)")
|
|
78
|
+
.argument("[packages...]", "Packages to fix (if omitted, analyzes all)")
|
|
79
|
+
.option("--dry-run", "Show what would be done without executing")
|
|
80
|
+
.option("--lang <locale>", "Language (en/es)", "en")
|
|
81
|
+
.action(async (packages, options) => {
|
|
82
|
+
setLocale(options.lang);
|
|
83
|
+
try {
|
|
84
|
+
await runFix(packages, options);
|
|
85
|
+
} catch (error) {
|
|
86
|
+
console.error(
|
|
87
|
+
`${t("error.fatal")} ${error instanceof Error ? error.message : String(error)}`,
|
|
88
|
+
);
|
|
89
|
+
process.exit(1);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
program
|
|
94
|
+
.command("watch")
|
|
95
|
+
.description("Continuous security audit every N seconds")
|
|
96
|
+
.argument("[path]", "Directory to audit", ".")
|
|
97
|
+
.option("-i, --interval <seconds>", "Interval in seconds", "300")
|
|
98
|
+
.option("--quick", "Quick scan")
|
|
99
|
+
.option("--lang <locale>", "Language (en/es)", "en")
|
|
100
|
+
.action(async (path, options) => {
|
|
101
|
+
setLocale(options.lang);
|
|
102
|
+
try {
|
|
103
|
+
await runWatch(path, {
|
|
104
|
+
interval: parseInt(options.interval, 10),
|
|
105
|
+
quick: options.quick,
|
|
106
|
+
});
|
|
107
|
+
} catch (error) {
|
|
108
|
+
console.error(
|
|
109
|
+
`${t("error.fatal")} ${error instanceof Error ? error.message : String(error)}`,
|
|
110
|
+
);
|
|
111
|
+
process.exit(1);
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
program
|
|
116
|
+
.command("config")
|
|
117
|
+
.description("Configure secmanifest")
|
|
118
|
+
.option("--slack-webhook <url>", "Configure Slack webhook")
|
|
119
|
+
.option("--discord-webhook <url>", "Configure Discord webhook")
|
|
120
|
+
.option("--clear-cache", "Clear results cache")
|
|
121
|
+
.option("--lang <locale>", "Language (en/es)", "en")
|
|
122
|
+
.action(async (options) => {
|
|
123
|
+
setLocale(options.lang);
|
|
124
|
+
if (options.slackWebhook || options.discordWebhook) {
|
|
125
|
+
const config: Record<string, string> = {};
|
|
126
|
+
if (options.slackWebhook) config.slackWebhook = options.slackWebhook;
|
|
127
|
+
if (options.discordWebhook) config.discordWebhook = options.discordWebhook;
|
|
128
|
+
await saveConfig(config);
|
|
129
|
+
console.log(t("config.saved"));
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
if (options.clearCache) {
|
|
133
|
+
await cacheClear();
|
|
134
|
+
console.log(t("config.cache_cleared"));
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
program.parse();
|